Shell是核心程序(kernel)之外的指令解析器,是一个程序,同时是一种命令语言和程序设计语言。
查看所有的shell
[root@localhost /]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
默认的shell
[root@localhost /]# echo $SHELL
/bin/bash
文件开头
#!/bin/sh
"#!" 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行修改权限后运行
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
要用./test.sh,就在当前目录找注释
#打印
echo "A is:"-
变量
#对变量赋值:
a="hello world"
#使用变量,加$符号
echo $a
echo ${a} #花括号识别变量边界unset a 删除变量 //变量相加需要加反引号 index=0 index= `expr index + 1`
-
字符串
字符串可以用单引号,也可以用双引号,也可以不用引号。//单引号 str='this is string' //双引号, 可以出现转义字符 your_name='hello' str="Hello, I know your are \"$your_name\"! \n" //获取字符串长度 string="abcd" echo ${#string} 提取子字符串 string="alibaba is a great company" echo ${string:1:4} #输出liba 查找子字符串 string="alibaba is a great company" echo 'expr index "$string" is'
-
数组
Linux shell 编程只支持一维数组,元素之间使用空格分开//数组表达式 array_name=(value1 ... valuen) //取值 ${array_name[index]} //eg. NAME[0]="Zara" NAME[1]="Qadir" NAME[2]="Mahnaz" NAME[3]="Ayan" NAME[4]="Daisy" echo "First Index: ${NAME[0]}" echo "Second Index: ${NAME[1]}" //使用@ 或 * 可以获取数组中的所有元素 ${NAME[@]} ${NAME[*]} //去除数组长度和字符串取长度一样 # 取得数组元素的个数 length=${#array_name[@]} # 或者 length=${#array_name[*]} # 取得数组单个元素的长度 lengthn=${#array_name[n]}
if
if 语句通过关系运算符判断表达式的真假来决定执行哪个分支。
if ... fi 语句;
if ... else ... fi 语句;
if ... elif ... else ... fi 语句。
具体语法, expression 和方括号([ ])之间必须有空格,否则会有语法错误。
if [ expression ]
then
//todo
fi
-
case ... esac
对应其他语言的switch语句case 值 in 模式1) //todo ;; 模式2) //todo ;; *) //todo ;; esac
;; 对应break 跳出循环, * 对应 default
eg.
echo 'Input a number between 1 to 4'
echo 'Your number is:\c'
read aNum
case $aNum in
1) echo 'You select 1'
;;
2) echo 'You select 2'
;;
3) echo 'You select 3'
;;
4) echo 'You select 4'
;;
*) echo 'You do not select a number between 1 to 4'
;;
esac
-
for 循环
for 变量 in 列表 do //todo done
列表是一组值(数字、字符串等)组成的序列,每个值通过空格分隔。每循环一次,就将列表中的下一个值赋给变量。
eg.
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
-
while
while command do //todo done
eg.
COUNTER=0
while [ $COUNTER -lt 5 ]
do
COUNTER='expr $COUNTER+1'
echo $COUNTER
done -
函数
function function_name () { //todo [ return value ] }
函数需要先定义后使用,function 关键字可以省略,函数返回值,可以显式增加return语句;如果不加,会将最后一条命令运行结果作为返回值。Shell 函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败。如果 return 其他数据,比如一个字符串,往往会得到错误提示:“numeric argument required”。
函数调用,只需要给出函数名,不需要加括号。
函数参数,示例
#!/bin/bash
funWithParam(){
echo "The value of the first parameter is $1 !"
echo "The value of the second parameter is $2 !"
echo "The value of the tenth parameter is $10 !"
echo "The value of the tenth parameter is ${10} !"
echo "The value of the eleventh parameter is ${11} !"
echo "The amount of the parameters is $# !" # 参数个数
echo "The string of the parameters is $* !" # 传递给函数的所有参数
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。
- 文件包含
像其他语言一样,Shell 也可以包含外部脚本,将外部脚本的内容合并到当前脚本。
. filename
//或者
source filename
注意: 点 后面有空格, 被包含的脚本不需要有执行权限
- 查看文件的 MD5值
md5sum <file>
- 调试 shell
执行脚本并显示所有变量的值
sh -x a.sh
不执行脚本,只是检查语法模式,将返回所有的语法错误
sh -n a.sh