C語言中文網 目錄
首頁 > Shell腳本 閱讀:8,172

Shell命令替換:將命名的輸出結果賦值給變量

Shell 命令替換是指將命令的輸出結果作為值賦給某個變量。比如,在某個目錄中輸入 ls 命令可查看當前目錄中所有的文件,但如何將輸出內容存入某個變量中呢?這就需要使用命令替換了,這也是 Shell 編程中使用非常頻繁的功能。

Shell 中有兩種方式可以完成命令替換,一種是反引號` `,一種是$(),使用方法如下:

var_name=`command`
var_name=$(command)

其中,var_name 是變量名,command 是要輸出的命令。

運行系統命令 date 可以得到當前的系統時間。在很多時候我們需要記錄腳本運行時間,所以只是運行這個命令是沒有意義的,必須將該命令的運行結果記錄并保存到變量中,并持久化到文件中,才能為后期分析提供有用的參考依據。
#!/bin/bash

DATE_01=`date`
DATE_02=$(date)
echo $DATE_01
echo $DATE_02
運行結果:
2018年 10月 31日 星期三 10:15:16 CST
2018年 10月 31日 星期三 10:15:16 CST

如果被替換的命令的輸出內容包括多行(也即有換行符),或者含有多個連續的空白符,那么在輸出變量時應該將變量用雙引號包圍,否則系統會使用默認的空白符來填充,這會導致換行無效,以及連續的空白符被壓縮成一個。請看下面的代碼:
#!/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~

所以,為了防止出現格式混亂的情況,我建議在輸出變量時加上雙引號。

再談反引號和 $()

原則上講,上面提到的兩種變量替換的形式是等價的,可以隨意使用;但是,反引號畢竟看起來像單引號,有時候會對查看代碼造成困擾,而使用 $() 就相對清晰,能有效避免這種混亂。而且有些情況必須使用 $():$() 支持嵌套,反引號不行。

下面的例子演示了使用計算 ls 命令列出的第一個文件的行數,這里使用了兩層嵌套。

[root@localhost ~]# Fir_File_Lines=$(wc -l $(ls | sed -n '1p'))
[root@localhost ~]# echo "$Fir_File_Lines"
36 anaconda-ks.cfg

要注意的是,$() 僅在 Bash Shell 中有效,而反引號可在多種 Shell 中使用。所以這兩種命令替換的方式各有特點,究竟選用哪種方式全看個人需求。

精美而實用的網站,提供C語言、C++、STL、Linux、Shell、Java、Go語言等教程,以及socket、GCC、vi、Swing、設計模式、JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo