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)返回特定字符

v a r : n u m s h e l l v a r n u m n u m 0 n u m 使 n u m {var:num}:shell在var中提取第num个字符到末尾的所有字符。若num为正数,从左边0处开始;若num为负数,从右边开始提取字串,但必须使用在冒号后面加空格或一个数字或整个num加上括号,如 var:numshellvarnumnum0num使num{var: -2}、 v a r : 1 3 {var:1-3}或 var:13{var:(-2)}

a=hello
echo ${a:4}
echo ${a: -4}

上面代码输出

o
h

v a r : n u m 1 : n u m 2 n u m 1 n u m 2 {var:num1:num2}:num1是位置,num2是长度。表示从 var:num1:num2num1num2var字符串的第 n u m 1 num1个位置开始提取长度为 num1num2的子串。不能为负数

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)
全部评论

相关推荐

不愿透露姓名的神秘牛友
11-21 19:05
面试官_我太想进步了:混学生会的,难怪简历这么水
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 10:48
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务