shell学习笔记

变量

定义、赋值及使用

定义/赋值变量时,变量名不加美元符号($),如

my_name=chengkai

需要注意的是,等号两端不能有空格!!!等号两端不能有空格!!!等号两端不能有空格!!!

同时,变量名的命名须遵循如下规则:

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

使用变量(的内容)时,需要在变量名之前加上美元符号($),并推荐使用花括号{}将变量括起来,这是一个好习惯,如

echo ${my_name}

echo "${my_name}'s great!"

只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

readonly my_name

注意:此处不需要在变量前面添加$符号,因为此处没事使用变量的内容。

删除变量

使用 unset 命令可以删除变量。如:

unset my_name

变量类型

运行shell时,会同时存在三种变量:

  • 1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  • 2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
  • 3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

Shell 字符串

字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。单双引号的区别跟PHP类似。

单引号

str='This is a string.'

单引号字符串的限制:

  • 单引号里的任何字符都会原样输出(如果是’$name’,那么输出的是$name,而不是变量name的内容),单引号字符串中的变量是无效的;
  • 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。

双引号

your_name='qinjx'
str="Hello, I know your are \"$your_name\"! \n"
双引号的优点:

  • 双引号里可以有变量
  • 双引号里可以出现转义字符

拼接字符串

your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1

获取字符串长度

string="abcd"
echo ${#string}#输出 4

提取子字符串

以下实例从字符串第 2 个字符开始截取 4 个字符:
string="This is a great site"
echo ${string:1:3}# 输出 his

查找子字符串

查找字符 “i 或 s” 的位置:
string="runoob is a great company"
echo `expr index "$string" is`# 输出 8
注意: 以上脚本中 “`” 是反引号,而不是单引号 “‘”,不要看错了哦。

数组

http://www.runoob.com/linux/linux-shell-variable.html页面的后半部分

需要注意的是:一个数组内可以保存不同类型的数据,比如整型、字符串、浮点型,而且下边也可以不连续,比如

array_name[0]=1
array_name[1]=2
array_name[2]="string item"
array_name[5]=6

read

read 命令一个一个词组地接收输入的参数,每个词组需要使用空格进行分隔;如果输入的词组个数大于需要的参数个数,则多出的词组将被作为整体为最后一个参数接收。测试文件 test.sh 代码如下:

read arg1 arg2    # 注意:arg1和arg2之间用空格隔开,不可用逗号,
echo "arg1 = "$arg1", arg2 = "$arg2

$ /bin/bash test.sh
string1 string2 string3
arg1 = string1, arg2 = string2 string3

实例

read -p "please input your password: " -n 6 -t 5 -s password
echo "password = ${password}"

说明:-p (promote)提示
-n 长度,超过指定长度自动停止
-t 时间,超过时间自动停止
-s (secret)不显示

算数运算的另一个实现方式

#!/bin/bash
a=2
b=3
val1=`expr $a + $b`
echo "val1 = $val1"
val2=$[$a+$b]
echo "val2 = $val2"
val3=$[a+b]
echo "val3 = $val3"

chmod +x shell2.sh
./shell2.sh

val1 = 5
val2 = 5
val3 = 5

let 不需要空格隔开表达式的各个字符。而 expr 后面的字符需要空格隔开各个字符。

until 循环

until循环执行一系列命令直至条件为真时停止。

until循环与while循环在处理方式上刚好相反。

一般while循环优于until循环,但在某些时候—也只是极少数情况下,until循环更加有用。

until 语法格式:

until condition
do
      command
done

条件可为任意测试条件,测试发生在循环末尾,因此循环至少执行一次—请注意这一点。

for 循环

for循环语法格式:

for((assignment;condition;next))
do
      command
done

如上所示,这里的 for 循环与 C 中的相似,但并不完全相同。

通常情况下 shell 变量调用需要加 $,但是 for 的 (()) 中不需要,下面来看一个例子:

for((i=1;i<10;i++))
do
    echo $i
done

与 C 中相似,赋值和下一步执行可以放到代码之前循环语句之中执行,这里要注意一点:如果要在循环体中进行 for 中的 next 操作,记得变量要加 $,不然程序会变成死循环。

函数

http://www.runoob.com/linux/linux-shell-func.html

函数返回值在调用该函数后通过 $? 来获得。

注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。

注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。

Shell 输入/输出重定向

需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。

如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:

command > /dev/null

/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到”禁止输出”的效果。

/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到”禁止输出”的效果。

如果希望屏蔽 stdout 和 stderr,可以这样写:

command > /dev/null 2>&1

关于>&的解释看链接中的笔记。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

3 × 2 =

− 1 = 1