shell基础语法

shell基础语法

if语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if [[ expression ][
then
Statement(s) to be executed if expression is true
fi

if test expression; then
Statement(s) to be executed if expression is true
fi

if [[ expression 1 ]]
then
Statement(s) to be executed if expression 1 is true
elif [[ expression 2 ]]
then
Statement(s) to be executed if expression 2 is true
elif [[ expression 3 ]]
then
Statement(s) to be executed if expression 3 is true
else
Statement(s) to be executed if no expression is true
fi

for循环

1
2
3
4
SERVICES="80   22   25   110   8000   23   20   21   3306   "
for x in $SERVICES; do
iptables -A INPUT -p tcp --dport $x -m state --state NEW -j ACCEPT
done

数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 以下是Bash的用法,与zsh的不同
# a=(1 2 3 4 5)
# echo $a
1
# echo ${#a[@]} # 用${#数组名[@或*]} 可以得到数组长度
5
# echo ${a[*]} # 用${数组名[下标]} 下标是从0开始 下标是:*或者@ 得到整个数组内容
1 2 3 4 5

# 直接通过 数组名[下标] 就可以对其进行引用赋值,如果下标不存在,自动添加新一个数组元素到数组末尾
# a[1]=100 && echo ${a[1]}
100
# a[10]=100 && echo ${a[*]} && echo ${a[10]} && echo ${#a[*]}
1 2 3 4 5 100
100
6

# 直接通过:unset 数组[下标] 可以清除相应的元素,不带下标,清除整个数据。
# unset a[1] && echo ${#a[*]} && echo ${a[1]} && echo ${a[*]}
5

1 3 4 5 100

# 直接通过 ${数组名[@或*]:起始位置:长度} 切片原先数组,返回是字符串,中间用“空格”分开,因此如果加上”()”,将得到切片数组,上面例子:c 就是一个新数据。
# a=(1 2 3 4 5) && echo ${a[@]:0:3}
1 2 3
# c=(${a[@]:1:4}) && echo ${#c[@]}
4

# 替换元素调用方法是:${数组名[@或*]/查找字符/替换字符} 该操作不会改变原先数组内容,如果需要修改,可以看上面例子,重新定义数据。
# a=(1 2 3 4 5) && c=(${a[@]/3/100}) && echo ${c[@]}
1 2 100 4 5

# 判断元素是否在数组中
# if [[ ${array[@]} =~ $item ]]; then echo 'yes'; fi

命令行解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# use break to jump out for loop
for opt in $@; do
case $opt in
init) project_init
break;;
start) start_train
break;;
stop) stop_train
break;;
resume) resume_train
break;;
*) show_usage
break;;
esac
done

函数返回值

  • 通过子命令的方式

    函数内部任何标准输出都会返回给接收变量,结果容易受到输出日志的干扰

    1
    2
    3
    4
    5
    6
    function foo {
    echo 1
    echo 2
    }
    a=$(foo)
    echo $a # 1 2
  • 通过return返回整数值,$?获取

    1
    2
    3
    4
    5
    6
    7
    function foo {
    echo 1
    echo 2
    return 0
    }
    foo # 1 2
    echo $? # 0

字符串操作

  • 截取字符串
表达式 含义
${#string} $string的长度
${string:position} 在$string中, 从位置$position开始提取子串
${string:position:length} 在$string中, 从位置$position开始提取长度为$length的子串
${string#substring} 从变量$string的开头, 删除最短匹配$substring的子串
${string##substring} 从变量$string的开头, 删除最长匹配$substring的子串
${string%substring} 从变量$string的结尾, 删除最短匹配$substring的子串
${string%%substring} 从变量$string的结尾, 删除最长匹配$substring的子串
${string/substring/replacement} 使用$replacement, 来代替第一个匹配的$substring
${string//substring/replacement} 使用$replacement, 代替所有匹配的$substring
${string/#substring/replacement} 如果$string的前缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
${string/%substring/replacement} 如果$string的后缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
  • 示例:

    ${str:0:-1} 去掉最后一个字符
    ${str:0: ${#str}} 返回整个字符串。避免写成$#str,$#有特殊含义,是传给函数或脚本的参数个数
    ``` 
  • 定义字符串

表达式 含义
${var} 变量var的值, 与$var相同
${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值,但是不会改变变量的值 *
${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *
${var=DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值,跟上面-的区别在于会设置变量的值 *
${var:=DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *
${var+OTHER} 如果var声明了, 那么其值就是$OTHER, 否则就为null字符串
${var:+OTHER} 如果var被设置了, 那么其值就是$OTHER, 否则就为null字符串
${var?ERR_MSG} 如果var没被声明, 那么就打印$ERR_MSG *
${var:?ERR_MSG} 如果var没被设置, 那么就打印$ERR_MSG *
${!varprefix*} 匹配之前所有以varprefix开头进行声明的变量
${!varprefix@} 匹配之前所有以varprefix开头进行声明的变量
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2015-2024 RivenZoo
  • Powered by Hexo Theme Ayer
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信