第一个Shell脚本程序
#!/bin/bash # 上面中的 #! 是一种约定标记, 它可以告诉系统这个脚本需要什么样的解释器来执行; echo "Hello World!"
定义变量
name="test" number=100 # 创建普通变量 local name="test" #创建只可函数体中使用的局部变量 unset name # 删除变量
使用变量
echo $name echo ${name} # 推荐使用大括号版
foo=bar echo "$foo" # 打印 bar echo '$foo' # 打印 $foo
参数
参数处理 | 说明 |
---|---|
$0 | 脚本名 |
$1到$9 | 脚本的参数.$1是第一个参数,依此类推 |
$@ | 所有参数 |
$# | 参数个数 |
$? | 前一个命令的返回值 |
$$ | 当前脚本的进程识别码 |
!! | 完整的上一条命令,包括参数。例:sudo !! |
$_ | 上一条命令的最后一个参数 |
获取字符串长度
echo ${#name} # 输出为4
定义数组
array_name=(value0 value1 value2 value3)
array_name[0]=value0 array_name[1]=value1 array_name[2]=value2
${array_name[index]}
${array_name[*]} #或 ${array_name[@]}
length=${#array_name[@]} #或 length=${#array_name[*]}
lengthn=${#array_name[n]}
算术运算符
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | 'expr $a + $b' |
- | 减法 | 'expr $a - $b' |
* | 乘法 | 'expr $a * $b' |
/ | 除法 | 'expr $b / $a' |
% | 取余 | 'expr $b % $a |
= | 赋值 | a=$b |
== | 用于比较两个数字,相同则返回 true | [ $a == $b ] |
!= | 用于比较两个数字,不相同则返回 true | [ $a != $b ] |
++ | 递增 | let "a++" 或 ((a++)) |
关系运算符
运算符 | 说明 | 举例 |
---|---|---|
-eq | 检测两个数是否相等,相等返回 true | [ $a -eq $b ] |
-ne | 检测两个数是否不相等,不相等返回 true | [ $a -ne $b ] |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true | [ $a -gt $b ] |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true | [ $a -lt $b ] |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回 true | [ $a -ge $b ] |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true | [ $a -le $b ] |
字符串运算符
运算符 | 说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等,相等返回 true | [ $a = $b ] |
!= | 检测两个字符串是否不相等,不相等返回 true | [ $a != $b ] |
-z | 检测字符串长度是否为0,为0返回 true | [ -z $a ] |
-n | 检测字符串长度是否不为 0,不为 0 返回 true | [ -n "$a" ] |
$ | 检测字符串是否为空,不为空返回 true | [ $a ] |
If语句
a=10 b=20 if [ $a == $b ] then echo "a is equal to b" else echo "a is not equal to b" fi
case ... esac语句
case 值 in 模式1) command1 command2 command3 ;; 模式2) command1 command2 command3 ;; *) command1 command2 command3 ;; esac
for循环
for 变量 in 列表 do command1 command2 ... commandN done # 列表是一组值(数字、字符串等)组成的序列,每个值通过空格分隔 # 每循环一次,就将列表中的下一个值赋给变量
for loop in 1 2 3 4 5 do echo "The value is: $loop" done # 顺序输出当前列表的数字
#!/bin/bash for FILE in $HOME/.bash* do echo $FILE done #显示主目录下以 .bash 开头的文件
for ((初始值; 限制值; 赋值运算)) do 程序段 done # 初始值:某个变量在循环中的起始值,直接以类似 i=1 设置好 # 限制值:当变量的值在这个限制值的范围内,就继续进行循环,例如 i<=100 # 赋值运算:每做一次循环时,变量也变化,例如i=i+1
#!/bin/bash read -p "Please input a number, I will count for 1+2+...+your_input: " nu s=0 for ((i=1; i<=${nu}; i=i+1)) do s=$((${s}+${i})) done echo "The result of '1+2+3+...+${nu}' is ==> ${s}" # 进行从1累加到用户输入的数值的循环
while循环
一般格式:
while condition do command done
Shell函数必须先定义后使用,定义如下,
function_name () { list of commands [ return value ] }
funWithParam(){ echo "第一个参数为 $1 !" echo "第二个参数为 $2 !" echo "第十个参数为 $10 !" echo "第十个参数为 ${10} !" echo "第十一个参数为 ${11} !" echo "参数总数有 $# 个!" echo "作为一个字符串输出所有参数 $* !" } funWithParam 1 2 3 4 5 6 7 8 9 34 73 :<<! 第一个参数为 1 ! 第二个参数为 2 ! 第十个参数为 10 ! 第十个参数为 34 ! 第十一个参数为 73 ! 参数总数有 11 个! 作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 ! ! # $10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数
. filename #或 source filename
一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
$ command 2> file # STDERR 重定向到 file $ command 2> file # STDERR 追加到 file 文件末尾
$ command > /dev/null
$ command > /dev/null 2>&1 # 屏蔽 STDOUT 和 STDERR