shell 是一个作为用户与系统间接口的程序,它允许用户向操作系统输入需要执行的命令
Table of Contents
基本
重定向
- 0 标准输入 
<<< - 1 标准输出 
>>> - 2 错误输出 
2>2>> 
> 是输出, >> 是以附加的方式输出
>& kill -9 1234 >killouterr.txt 2>&1
管道
管道用操作符 |
脚本
格式
第一行指定执行 shell 的文件,一般是 #!/bin/bash 或 #!/bin/sh
运行
- 直接运行 
sh xx.sh或者bash xx.sh - 可执行文件 先 
chmod +x xx.sh然后./xx.sh 
Shell语法(*)
变量
- 变量不需要提前声明
 - 变量名区分大小写
 - 创建变量时通过直接赋值给变量 eg. 
var=abc - 访问变量时需要在变量名前加一个 
$符号 eg.echo $var或echo ${var} - 在赋值时,等号两边不能有空格 eg. 
var=abc - 如果字符串里有空格,则必须用双引号把字符串括起来 
var="Hello World" 
$ a=hello $ echo $a hello $ b=a $ echo $b a $ b=world $ echo $b world $ echo $a hello
引号
- read 读入数据时,带有空格的数据不需要加引号
 
$ read var Hello World $ echo $var Hello World
- 对于变量 
$var,如果放在双引号""中,则会替换为其值 - 如果放在单引号 
''中,则不会发生替换 - 还可以在 
$前面加上\符号取消其转义行为 
var="Hello World" echo $var # Hello World echo "$var" # Hello World echo '$var' # $var echo \$var $var
环境变量
条件
test或[命令
if test -f file.c ; then ... fi
或
if [ -f file.c ] ; then ... fi
- 字符串的比较
 
str1 = str2 str1 != str2 str1 > str2 str1 < str2 -n str 如果字符串不为空则为 True -z str 如果字符串为 null,则结果为真
- 算数比较
 
exp1 -eq exp2 == exp1 -ne exp2 != exp1 -gt exp2 > exp1 -ge exp2 >= exp1 -lt exp2 < exp1 -le exp2 <= !exp 如果 exp 为假则返回真
- 文件条件测试
 
-d file directory -e file exist -f file common file -g file set-group-id ??? -r file readable -s file file space is not 0 -u file set-user-id ??? -w file writeable -x file executeable
- (( expression ))
 
可以使用高级数学特性
val++ val-- ++val --val ! 逻辑求反 ~ 位求反 ** 幂运算 << 左移位 >> & 按位与 | && 逻辑与 ||
- [[ expression ]]
 
字符串的比较,但是支持模式匹配
控制结构
if 语句
if condition then statement elif condition; then statement else statement fi
for 语句
for var in values do statement done
循环一个序列:
for var in {1..5} do echo $var done
while 语句
while condition do statenment done
until 语句
until condition do statenment done
case 语句
case var in passtern [| pattern]... ) statement1;; passtern [| pattern]... ) statement2;; ... esac
注: 每个模式都以 ;; 结尾
#!/bin/sh # case statement echo "Please answer yes or no" read ans case "$ans" in yes | y | Yes | YES ) echo "yes";; no | n | No | NO ) echo "no";; esac exit 0
AND OR 列表
&& ||
con1 && con2 && con3 con1 || con2 || con3
语句块
{}
函数
function_name(){ statement }
命令
break:continue.echoeval
对语句进行求值
foo=10 x=foo # echo $y --> foo y='$'$x echo $y # --> $foo eval y='$'$x echo $y # --> 10
execexit nexportexpr
把参数当作表达式来求值
x=`expr $x + 1` x=$(expr $x + 1)
printfreturnsetshifttrapunsetfindgrep
补充
算数运算
$((...)) x=$(($x+1))
命令行获取参数
#!/bin/bash while getopts "a:bc" arg do case $arg in a) echo "a's arg:$OPTARG" echo "a's ind:$OPTIND" ;; b) echo "b" echo "b's ind:$OPTIND" ;; c) echo "c" echo "c's ind:$OPTIND" ;; ?) echo "fuck you" exit 1 ;; esac done
特殊参数
$* : 等价于 to $1c$2c.., 其中 c 是 IFS 变量的值的第一个字符
$@ : 等价于 $1 $2
$# : 参数的个数
$? : 退出状态
$0 : 源码文件名