1. 如何在shell腳本中使用變數
在shell腳本中變數的定義,只能以字母和下劃線開始,區分大小寫,可以包含數字、字母下劃線。
示例代碼,讀取用戶輸入到變數myvar,然後再輸入。
#!/bin/bash
echo "input myvar"
read myvar
echo "myvar is $myvar"
效果如下:
2. shell如何執行變數中的語句
Shell是一個用C語言編寫的程序,它是用戶使用Linux的橋梁。Shell既是一種命令語言,又是一種程序設計語言,涵蓋的知識點多且雜,卻是雲計算開發人員必須要掌握的技術之一。接下來就給大家梳理一下Shell變數相關的知識。
Linux Shell中的變數可以被指定為任意的數據類型,比如文本字元串或者數值。你也可以通過修改Shell中的變數來改變Shell的樣式。
Shell支持三種定義變數的方式:
variable=value
variable='value'
variable="value"
variable是變數名,value是賦給變數的值。如果value不包含任何空白符(例如空格、Tab縮進等),那麼可以不使用引號;如果value包含了空白符,那麼就必須使用引號包圍起來。注意,賦值號=的周圍不能有空格。
Shell變數的命名規范和大部分編程語言一樣:變數名由數字、字母、下劃線組成;必須以字母或者下劃線開頭;不能使用Shell里的關鍵字(通過help命令可以查看保留關鍵字)。
Linux中Shell變數分為系統變數和用戶自定義變數,系統變數包括$HOME、$PWD、$SHELL、$USER、echo $SHELL以及顯示當前Shell中所有變數set。
Shell自定義變數包括1)定義變數:變數=值;2)撤銷變數:unset變數;3)聲明靜態變數:readonly變數,注意不能unset;4)使用export把變數提升為全局環境變數,如/etc/profile中的TOMCAT_HOME變數,且在另外的/opt/tmp/shell/myShell.sh腳本中使用該環境變數。
Shell設置環境變數
基本語法:
1)export:變數名=變數值(功能描述:將shell變數輸出為環境變數)
2)source:配置文件(功能描述:讓修改後的配置文件立即生效)
3)echo:$變數名(功能描述:查詢環境變數的值)
單行注釋:#
多行注釋::<<!需要注釋的內容!
Shell腳本很適合處理純文本類型的數據,而Linux中幾乎所有的配置文件、日誌文件(如NFS、Rsync、Httpd、Nginx、MySQL等),以及絕大多數的啟動文件都是純文本類型的文件。Shell是運維人員必須要掌握的技能,此外還需要掌握Linux、信息安全、Docker容器等。
3. unix shell 腳本要執行的文件在 shell 腳本中的變數
這個文件是DOS格式的還是UNIX格式的, 還是MAC格式的
(1) vim filename
然後用命令 :set ff
可看到dos或unix的字樣,如果的確是dos格式的, 那麼用set ff=unix把它強制為unix格式的,,然後存檔退出後就可運行。
轉換不同平台的文本文件格式可以用
1. unix2dos或dos2unix這兩個小程序來做. 很簡單. 在djgpp中這兩個程序的名字叫dtou和utod, u代表unix, d代表dos
2. 也可以用sed 這樣的工具來做:
復制代碼代碼如下:
sed 『s/^M//' filename > tmp_filename
mv -f tmp_filename filename
特別說明:^M並不是按鍵shift + 6產生的^和字母M, 它是一個字元, 其ASCII是0x0D, 生成它的辦法是先按CTRL+V, 然後再回車(或CTRL+M)
另外, 當SHELL程序報告command not found時, 總是去檢查一下你的PATH裡面有沒有程序要用到的每一個命令(沒指定絕對路徑的那種). 你這么小的程序, 可以一行一行核對。
4. 如何正確在Linux Shell腳本中定義一個時間變數
1、創建腳本 test.sh,並入截圖內容。
5. linux shell腳本,怎樣變數傳遞執行結果
1、shell一般都是放在/bin或者/user/bin目錄下,我們可以使用命令cat /etc/shells命令,查看當前linux系統可用的shell是什麼。
6. shell如何執行變數裡面的腳本
如果變數里存放的是腳本所在的文件位置,在當前bash下運行可以使用source $變數,
在新的Bash下運行,可以用bash $變數
如果變數存放的一些命令字元串,簡單的例子a='ls -l'
可以直接輸入 $a 回車就會執行後面的那串命令
或者使用eval $a
兩者還是有點差異的,如下圖:
7. 如何在shell腳本中執行系統命令 小小知識站
方法一:切換到shell腳本所在的目錄(此時,稱為目錄)執行shell腳本:碼碼如下:cd /data/shell./hello.sh./的意思是說在當前的目錄下執行hello.sh。如果不加上./,bash可能會響應找到不到hello.sh的錯誤。因為目前的目錄(/data/shell)可能不在執行程序默認的搜索路徑之列,也就是說,不在環境變數PASH的內容之中。查看PATH的內容可用 echo $PASH 命令。現在的/data/shell就不在環境變數PASH中的,所以必須加上./才可執行。方法二:以絕對路徑的方式去執行bash shell腳本:碼碼如下:/data/shell/hello.sh方法三:直接使用bash 或sh 來執行bash shell腳本:碼碼如下:cd /data/shellbash hello.sh或碼碼如下:cd /data/shellsh hello.sh注意,若是以方法三的方式來執行,那麼,可以不必事先設定shell的執行許可權,甚至都不用寫shell中的第一行(指定bash路徑)。因為方法三是將hello.sh作為參數傳給sh(bash)命令來執行的。這時不是hello.sh自己來執行,而是被人家調用執行,所以不要執行許可權。那麼不用指定bash路徑自然也好理解了啊,呵呵……。方法四:在當前的shell環境中執行bash shell腳本:碼碼如下:cd /data/shell. hello.sh或碼碼如下:cd /data/shellsource hello.sh前三種方行shell腳本時都是在當前shell(稱為父shell)開啟一個子shell環境,此shell腳本就在這個子shell環境中執行。shell腳本執行完後子shell環境隨即關閉,然後又回到父shell中。而方法四則是在當前shell中執行的。
8. shell腳本中怎麼執行變數里的命令(執行問題補充中變數v_endcomm)
有兩種方式:
(1) 把v_endcomm裡面的命令全部拿出來, 即直接
echo $v_full" | sed '1,/)/d' | sed 's/,$//'"
(2) 把上述命令做成一個函數, 函數名為v_endcomm
v_endcomm(){
echo $v_full" | sed '1,/)/d' | sed 's/,$//'"
}
然後調用v_endcomm即可
9. shell 變數名中包含變數怎麼弄
1 shell變數基礎
shell變數是一種很「弱」的變數,默認情況下,一個變數保存一個串,shell不關心這個串是什麼含義。所以若要進行數學運算,必須使用一些命令例如let、declare、expr、雙括弧等。shell變數可分為兩類:局部變數和環境變數。局部變數只在創建它們的shell中可用。而環境變數則可以在創建它們的shell及其派生出來的任意子進程中使用。有些變數是用戶創建的,其他的則是專用shell變數。變數名必須以字母或下劃線字元開頭。其餘的字元可以是字母、數字(0~9)或下劃線字元。任何其他的字元都標志著變數名的終止。名字是大小寫敏感的。給變數賦值時,等號周圍不能有任何空白符。為了給變數賦空值,可以在等號後跟一個換行符。用set命令可以查看所有的變數,unset var命令可以清除變數var,var相當於沒有定義過。readonly var可以把var變為只讀變數,定義之後不能對var進行任何更改。對shell變數的引用方式很多,用這些方式可以方便的獲取shell變數的值,變數值的長度,變數的一個字串,變數被部分替換後的值等等。shell變數常見引用方式如下:
2 環境變數
環境變數的定義方法如下:
var=value
export var
shell在初始化的時候會在執行profile等初始化腳本,腳本中定義了一些環境變數,這些變數會在創建子進程時傳遞給子進程。
用env命令可以查看當前的環境變數。常用的系統環境變數如下:
_(下劃線) 上一條命令的最後一個參數
BASH 展開為調用bash實例時使用的全路徑名
CDPATH cd命令的搜索路徑。它是以冒號分隔的目錄列表,shell通過它來搜索cd命令指定的目標目錄。例如.:~:/usr
EDITOR 內置編輯器emacs、gmacs或vi的路徑名
ENV 每一個新的bash shell(包括腳本)啟動時執行的環境文件。通常賦予這個變數的文件名是.bashrc。
EUID 展開為在shell啟動時被初始化的當前用戶的有效ID
GROUPS 當前用戶所屬的組
HISTFILE 指定保存命令行歷史的文件。默認值是~/.bash_history。如果被復位,互動式shell退出時將不保存命令行歷史
HISTSIZE 記錄在命令行歷史文件中的命令數。默認是500
HOME 主目錄。未指定目錄時,cd命令將轉向該目錄
IFS 內部欄位分隔符,一般是空格符、製表符和換行符,用於由命令替換,循環結構中的表和讀取的輸入產生的詞的欄位劃分
LANG 用來為沒有以LC_開頭的變數明確選取的種類確定locale類
OLDPWD 前一個工作目錄
PATH 命令搜索路徑。一個由冒號分隔的目錄列表,shell用它來搜索命令,一個普通值為 /usr/gnu/bin:/usr/local/bin:/usr/ucb:/usr/bin
PPID 父進程的進程ID
PS1 主提示符串,默認值是$
PS2 次提示符串,默認值是>
PS3 與select命令一起使用的選擇提示符串,默認值是#?
PS4 當開啟追蹤時使用的調試提示符串,默認值是+。追蹤可以用set –x開啟
PWD 當前工作目錄。由cd設置
RANDOM 每次引用該變數,就產生一個隨機整數。隨機數序列可以通過給RANDOM賦值來初始化。如果RANDOM被復位,即使隨後再設置,它也將失去特定的屬性
REPLY 當沒有給read提供參數時設置
SHELL 當調用shell時,它掃描環境變數以尋找該名字。shell給PATH、PS1、PS2、MAILCHECK和IFS設置默認值。HOME和MAIL由login(1)設置
SHELLOPTS 包含一列開啟的shell選項,比如braceexpand、hashall、monitor等
UID 展開為當前用戶的用戶ID,在shell啟動時初始化
3 數值變數
shell中默認把變數值當作字元串,例如:
age=22
age=${age}+1
echo ${age}
輸出結果為22+1,而不是23,因為shell將其解釋為字元串,而不是數學運算。
可以用let命令使其進行數學運算,例如:
let age=${age}+1
也可以用declare把變數定義為整型。例如:
declare -i age=22
這里就用 -i 選項把age定義為整型的了。此後每次運算,都把age的右值識別為算術表達式或數字。
4 數組
在shell中可以使用數組,例如:
array[0]=0
array[1]=1
array[2]=2
則array就是一個數組,也可以這樣給數組初始化:
array=(0 1 2) // 元素之間以空格分隔
可以通過 ${array[$i]}來訪問array中某個元素,${array[*]} 的返回值即數組的所有元素組成的串,${#array[*]} 的返回值即數組的元素個數,${array[*]:0:2} 返回第一個和第二個元素組成的串。0表示開始的位置,2表示要返回的元素個數,開始位置可以為0-2(0減去2)之類的,表示從倒數第二個元素開始。
下面寫個稍微復雜點的例子:
1 #!/bin/bash
2 for ((i=0; i<100; i++))
3 do
4 array[$i]=$i
5 done
6 for ((i=0; i<100; i++))
7 do
8 echo ${array[$i]}
9 done
如果要使用二維數組甚至三維數組該怎麼實現呢,那就需要用eval命令來模擬數組的功能了。
eval命令的作用是掃描命令兩次再執行,如果不使用eval,只掃描一次,然後執行。看個例子:
root@suse:~$ name=Barry
root@suse:~$ $name=hello
Barry=hello: command not found
為什麼第二句給Barry變數賦值會出錯呢?從報錯信息可以發現shell並沒有識別這是個賦值語句,而是把Barry=hello當作一個命令來執行,當然會報錯。為什麼不能識別這是賦值語句呢?第一次掃描時,因為掃描到$符號,所以不能把這句當作賦值語句,賦值語句的左邊總是一個變數名,而不應該是$開頭的。所以第一次掃描僅僅識別了$name變數,並做了替換,而並沒有認識到賦值語句。
如果使用eval $name=hello呢?
root@suse:~$ name=Barry
root@suse:~$ $name=hello
Barry=hello: command not found
root@suse:~$ eval $name=hello
root@suse:~$ echo $Barry
hello
可見使用了eval之後,對 $name=hello 第一次掃描替換了$name,沒有識別賦值語句,第二次掃描識別是賦值語句,然後執行。現在大約可以想到怎樣用eval實現二維數組了。
下面實現的二維數組每一行代表一個人的信息記錄,包括姓名,年齡。
1 for ((i=0; i<2; i++))
2 do
3 for ((j=0; j<2; j++))
4 do
5 read man$i$j
6 done
7 done
8 echo "next print:"
9 for ((i=0; i<2; i++))
10 do
11 for ((j=0; j<2; j++))
12 do
13 eval echo -n "\$man$i$j:"
14 done
15 printf "\n"
16 done
5 特殊變數
$0:當前腳本的文件名
$num:num為從1開始的數字,$1是第一個參數,$2是第二個參數,${10}是第十個參數
$#:傳入腳本的參數的個數
$*:所有的位置參數(作為單個字元串)
$@:所有的位置參數(每個都作為獨立的字元串)。
$?:當前shell進程中,上一個命令的返回值,如果上一個命令成功執行則$?的值為0,否則為其他非零值,常用做if語句條件
$$:當前shell進程的pid
$!:後台運行的最後一個進程的pid
$-:顯示shell使用的當前選項
$_:之前命令的最後一個參數
10. 什麼事位置變數shell的變數類型有哪些種
比如要運行的程序是test.sh
test.sh 1 2 3 a b
上邊的 1 2 3 a b傳遞到腳本里就是位置變數 $1 $2 $3 $4 $5
shell的變數基本上分為:全局變數,本地變數(或叫局部變數)。
Shell是一個用C語言編寫的程序,它是用戶使用Linux的橋梁。Shell既是一種命令語言,又是一種程序設計語言,涵蓋的知識點多且雜,卻是雲計算開發人員必須要掌握的技術之一。接下來就給大家梳理一下Shell變數相關的知識。
(10)shell腳本執行命令時變數擴展閱讀:
實際上Shell是一個命令解釋器,它解釋由用戶輸入的命令並且把它們送到內核。不僅如此,Shell有自己的編程語言用於對命令的編輯,它允許用戶編寫由shell命令組成的程序。Shell編程語言具有普通編程語言的很多特點,比如它也有循環結構和分支控制結構等,用這種編程語言編寫的Shell程序與其他應用程序具有同樣的效果。