learning bash

变量

  • 变量定义和赋值,变量名和赋值符号和值之间不能有空格
  • 变量名规则和c语言要求一致
  • 使用已定义的变量用$引用,如$FUCK${FUCK},花括号只起边界作用
  • 可以使用readonly xxxx,将xxxx设置为只读变量,只读变量不允许修改和删除
  • unset可以删除变量
  • 字符串
    • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
    • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
    • 双引号里可以有变量
    • 双引号里可以出现转义字符
    • 字符串可以直接拼接"ahh"${agg}"ahhhh"
    • 子串${string:1:2}
    • 串长
      1
      2
      3
      4
      5
      6
      - 数组
      - 只支持一维数组
      - 定义`a=(var1 var2 var3)`
      - `a[n]=111`
      - 读取数组`$(a[n])`,使用`@`可以获取数组全部元素
      - 数组长度```${#a[*]}

传参

$0: 可执行文件文件名
$#: 传递参数数量
$*: 传递的所有参数
$$: 当前运行脚本的PID
$@: 和$*一样
$-: 显示Shell使用的当前选项
$?: 最后命令的退出状态。0表示没有错误,其他任何值表明有错误

中括号

  • 算术比较, 比如一个变量是否为0, [ $var -eq 0 ]
    • -eq 相等
    • -ne 不等
    • -gt 大于
    • -lt 小于
    • -ge 大于或等于
    • -le 小于或等于
  • 文件属性测试,比如一个文件是否存在,[ -e $var ]
    • -b 是否块设备文件
    • -c 是否字符设备文件
    • -d 是否目录
    • -e 文件是否存在
    • -f 正常文件路径或文件名
    • -x 可执行文件
    • -L 是否符号连接
    • -r 是否可读
    • -w 是否可写
  • 字符串比较
    • 两个字符串是否相同 [[ $var1 = $var2 ]],test $var1 = $var2
    • 两个字符串是否不同 [[ $var1 != $var2 ]]
    • 是否空串 [[ -z $str1 ]]
    • 是否非空串 [[ -n $str1 ]]

运算符

  • 布尔运算
    • !
    • -o,||
    • -a,&&

printf

printf format-string [arguments...]

  • 格式化方式和c语言的printf一致

控制

if

1
2
3
4
5
6
7
8
9
10
11
12
13
14
a=10
b=20
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi

for

1
2
3
4
5
6
7
8
9
10
11
12
13
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
####################################
for((assignment;condition:next));do
command_1;
command_2;
commond_..;
done;

while

1
2
3
4
while condition
do
command
done

case

1
2
3
4
5
6
7
8
9
10
case 值 in
模式1)
...
commandN
;;
模式2)
...
commandN
;;
esac

函数

参数获取方式和cmd的参数获取一致

1
2
3
4
5
[ function ] funname [()]
{
action;
[return int;]
}

输入输出重定向

  • command > file 将输出重定向到 file
  • command < file 将输入重定向到 file
  • 文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)