Skip to content

Shell 脚本

参考资料

基本

  • #! 是一个约定的标记, 用于指定脚本解释器
  • zsh test.sh 以这种方式运行的脚本忽略指定
  • # 注释
#!/bin/bash
echo "Hello World !"

变量

  • 类似 py 的声明方式, = 两侧不能有空格
  • ${name} 使用变量 (包括在字符串中展开)
  • readonly name 声明变量只读 (不是声明变量时)
  • unset 删除变量
  • declare/typeset -i my_integer=42 声明变量类型, -i 整数
name="abc$LANG"->abczh_CN...
name='abc\&LANG'->abc&LANG
# 引号的区别

字符串

  • ${name:1:4} 提取子字符串
  • ${name:(-1)} 提取最后一个字符
  • ${name:0:-1} 提取除了最后一个字符的所有字符
  • echo 反引expr index "$string" io反引 查找字符位置 (i 或 o)

数组

  • val=${array_name[n]} 获取元素
  • val=${array_name[@]} 获取所有元素
  • len=${#array_name[@]} 获取元素数量
  • len=${#array_name[*]} 获取元素长度
  • declare -A map 声明数组类型 -A 关联数组 (字典),-a 数组
  • echo "数组的键为: ${!site[*]}" 所有键

参数

  • 环境变量
  • $0 脚本名称
  • $1,$2 脚本参数
  • $# 参数数量
  • $? 上一个命令的退出状态
  • $* 所有参数 (字符串形式)
  • $$ 当前进程 ID 号
  • $! 后台运行的最后一个进程的 ID
  • $- 显示 Shell 使用的当前选项, 与 set 命令功能相同

运算符

算术

  • expr $a + $b 其中 expr 用于表达式计算
  • 注意, 赋值左值无需 $
  • [ $a ==/!= $b ] 注意所有空格必要

关系

  • -eq 相等
  • -ne 不相等
  • -gt 大于
  • -lt 小于
  • -ge 大于等于
  • -le 小于等于
  • [ $a -eq $b ] 注意所有空格必要

布尔

  • -a
  • -o
  • !

字符串相关

  • = 相等
  • != 不相等
  • -z
  • -n 非空
  • $ 字符串长度

文件测试

  • -e 存在
  • -d 目录
  • -f 普通文件
  • -c 字符设备文件 如键盘
  • -b 块设备文件 如硬盘
  • -s 非空
  • -r 可读
  • -w 可写
  • -x 可执行
  • -g SGID
  • -u SUID
  • -k 设置粘着位
  • -p 有名管道
  • -s 套接字
  • -L 符号链接

其它

  • let name++/-- 自增 / 自减
  • a=$((a+1)) 算术
  • ((a++/--)) 自增 / 自减

命令

echo

  • echo "\"It is a test\"" 转义
  • echo -e "OK! \n" -e\n 换行 \c 跟下一行连接
  • echo "It is a test" > myfile 重定向
  • echo 反引date反引 显示命令结果

printf(可移植)

  • printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg 格式化输出, 可以指定宽度, 类型, 并且随意使用转义字符

test(可移植)

  • test 布尔/字符串/文件测试运算式 返回真值

流程控制

if

if test condition
then
    command1
elif (( a<b ))
then 
    command2
else
    commandN
fi

for

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

whileuntil

int=1
while(( $int<=5 )) # until与之相反
do
    echo $int
    let "int++"
done

case

#!/bin/sh

site="runoob"

case "$site" in
   "runoob") echo "菜鸟教程" 
   ;;
   "google") echo "Google 搜索" 
   ;;
   "taobao") echo "淘宝网" 
   ;;
esac

breakcontinue

  • 词义自明

函数

[ function ](可选) fun_name ()
{
    action;

    [return int;](可选,int为0-255)
}

输入 / 输出重定向

  • command > / < / >> file 重定向
  • commandstdin/stdout/stderr 对应 0/1/2 因此有 command 2>&1
  • /dev/null 黑洞
$ wc -l << EOF  # Here Document 将EOF中的内容作为command的输入
    欢迎来到
    菜鸟教程
    www.runoob.com
EOF

文件包含

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

#使用 . 号来引用test1.sh 文件
. ./test1.sh

# 或者使用以下包含文件代码
# source ./test1.sh

echo "菜鸟教程官网地址:$url"