shell指令结果保存到变量中
1. 方法一: 反引号
#!/bin/bash
a=`ls -l; pwd; date;`
echo "$a"
b=`ls -l
pwd
date`
echo "$b"
2. 方法二:使用 $()
#!/bin/bash
a=$(ls -l)
echo "$a"
3. 注意事项
- 默认情况只会将标准输出保存到变量中,如果需要加异常结果也保存到变量,需要加 2>&1
#!/bin/bash
a=$(xxx 2>&1)
echo "$a"
- echo回显变量的时候需要加双引号"" ,作用是保留换行符号,否则会用空格代替换行,丢失换行。
- 需要再次操作变量,可以使用 echo "$a"来读取变量
- 反引号和单引号非常相似,容易产生混淆,两种方式相比较而言更推荐使用$()方式。
#!/bin/bash
LSL=`ls -l`
echo $LSL #不使用双引号包围
echo "--------------------------" #输出分隔符
echo "$LSL" #使用引号包围
运行结果
total 8 drwxr-xr-x. 2 root root 21 7月 1 2016 abc -rw-rw-r--. 1 mozhiyan mozhiyan 147 10月 31 10:29 demo.sh -rw-rw-r--. 1 mozhiyan mozhiyan 35 10月 31 10:20 demo.sh~
--------------------------
total 8
drwxr-xr-x. 2 root root 21 7月 1 2016 abc
-rw-rw-r--. 1 mozhiyan mozhiyan 147 10月 31 10:29 demo.sh
-rw-rw-r--. 1 mozhiyan mozhiyan 35 10月 31 10:20 demo.sh~
所以,为了防止出现格式混乱的情况,我建议在输出变量时加上双引号。
4. 再谈反引号和 $()
原则上讲,上面提到的两种变量替换的形式是等价的,可以随意使用;但是,反引号毕竟看起来像单引号,有时候会对查看代码造成困扰,而使用 $() 就相对清晰,能有效避免这种混乱。而且有些情况必须使用 ( ) : (): ():() 支持嵌套,反引号不行。
下面的例子演示了使用计算 ls 命令列出的第一个文件的行数,这里使用了两层嵌套。
[c.biancheng.net]$ Fir_File_Lines=$(wc -l $(ls | sed -n '1p'))
[c.biancheng.net]$ echo "$Fir_File_Lines"
36 anaconda-ks.cfg
要注意的是,$() 仅在 Bash Shell 中有效,而反引号可在多种 Shell 中使用。所以这两种命令替换的方式各有特点,究竟选用哪种方式全看个人需求。