shell中的各种括号
shell中的各种括号
一、圆括号()、(())
1.单圆括号 ()
(1)命令替换:$(cmd)
KaTeX parse error: Can't use function '\`' in math mode at position 8: (cmd))和\̲`̲cmd\`一样,用于命令替换,…(cmd)并非如此
a=`pwd`
echo $a
上面代码用$()可写成
a=$(pwd)
echo $a
上面代码输出当前路径
/home/j
(2)新开子shell执行命令:(cmd1;cmd2;cmd3;…)
相当于新开一个子shell去执行括号中的命令,命令会顺序执行,由于是子shell,括号中的变量b不被脚本余下的部分使用
(pwd;uname;who)
上面代码输出
/home/j
Linux
j tty1 2019-10-30 15:26 (:0)
(3)初始化数组:array_name=(value1 vaule2 …)
array=(a b c)
echo ${array[0]}
上面代码输出
a
2.双圆括号 (())
(1)增强表达式
二、方括号[]、[[]]
1.单方括号 []
(1)相当于test:if [ exp ]
例如有以下代码
a=3
b=4
if test $a -eq $b
then
echo "两数相等"
else
echo "两数不等"
fi
可以写下面的形式
a=3
b=4
if [ $a -eq $b ]
then
echo "两数相等"
else
echo "两数不等"
fi
注:方括号与表达式之间隔着空格
上面代码都是输出
两数不等
(2)进行整数运算:$[]
和 (())一样,[]用作数据运算,但是在bash中只能进行整数运算
a=1
b=2
c=$(($a+$b))
echo $c
注: (())内变量可不用,写成c=$((a+b))
上面代码可以写成
a=1
b=2
c=$[$a+$b]
echo $c
注:同样的,$[]内的变量可不用$,写成c=[a+b]
上面代码都是输出
3
(3)索引数组:array_name[]
array=(a b c)
echo ${array[0]}
上面代码输出
a
2.双方括号 [[]]
(1)增强表达式 [[ exp ]]
&&、||、<>等逻辑操作存在单引号[ ]中会报错,当存在[[ ]]中不会报错
a=1
b=2
if [ $a -eq 1 ] && [ $b -eq 2 ]
then
echo "true"
else
echo "false"
fi
上面代码如果用双中括号[[]]可写成
a=1
b=2
if [[ $a -eq 1 && $b -eq 2 ]]
then
echo "true"
else
echo "false"
fi
上面代码都是输出
true
三、花括号{}
1.返回变量值
(1)基本用法 ${var}
a=hello
echo ${a}
上面代码输出
hello
(2)返回特定字符
var:num:shell在var中提取第num个字符到末尾的所有字符。若num为正数,从左边0处开始;若num为负数,从右边开始提取字串,但必须使用在冒号后面加空格或一个数字或整个num加上括号,如{var: -2}、 var:1−3或{var:(-2)}
a=hello
echo ${a:4}
echo ${a: -4}
上面代码输出
o
h
var:num1:num2:num1是位置,num2是长度。表示从var字符串的第 num1个位置开始提取长度为num2的子串。不能为负数
a=hello
echo ${a:0:2}
上面代码输出
he
(3)替换字符返回
- ${var/pattern/pattern}:表示将var字符串的第一个匹配的pattern替换为另一个pattern
a=hello
echo ${a/l/b}
上面代码输出
heblo
- ${var//pattern/pattern}:表示将var字符串中的所有能匹配的pattern替换为另一个pattern
a=hello
echo ${a//l/b}
上面代码输出
hebbo
(4)设置变量返回
总共有以下操作
- ${var-value}:当 var 没有被预先定义时,返回 value。
- ${var:-value}:当 var 没有被预先定义,或者被定义为空时,返回 value。
- ${var=value}:当 var 没有被预先定义时,返回 value,同时设置 var=value。
- ${var:=value}:当 var 没有被预先定义,或者被定义为空时,返回 value,同时设置 var=value。
- ${var?value}:当 var 没有被预先定义时,返回 value,而后终止脚本。
- ${var:?value}:当 var 没有被预先定义,或者被定义为空时,返回 value,而后终止脚本。
- ${var+value}:当 var 已经被定义时,返回 value。
- ${var:+value}:当 var 已经被定义并且不为空时,返回 value
a=hello
echo ${a:=word}
echo ${a}
上面代码输出
hello
hello
echo ${b:=hello}
echo ${b}
上面代码输出
hello
hello
2.文件名扩展
touch a.txt
touch b.txt
touch c.txt
上面代码可写成
touch {a,b,c}.txt
也可以写成
touch {a..c}.txt
上面代码都是创建文件a.txt、b.txt、c.txt
3.代码块 { cmd1;cmd2;…;}
与(cmd1;cmd2;,…)不同的是,{ cmd1;cmd2;…;}不会新开子shell
{ pwd;uname;who;}
上面代码输出
/home/j
Linux
j tty1 2019-10-30 15:26 (:0)