① shell循環取出目錄下的文件名然後作為變數在程序中運行
#!/bin/sh
filelist=$(ls)
echo "hello"
for file in $filelist
do
if [ -d $file ]
then
tar -cf $file.tar $file
fi
done
② 如何在shell腳本中使用變數
系統定義的變數:
這些變數由操作系統(linux)自身創建並維護,通常它們以大寫字母定義,我們可以通過命令「$ set」來查看這些變數。下面列出了部分系統定義的變數:
系統定義的變數
意義
BASH=/bin/bash
Bash Shell 名稱
BASH_VERSION=4.1.2(1)
Bash 版本
COLUMNS=80
你的屏幕寬度(列數)
HOME=/home/linuxtechi
用戶家目錄
LINES=25
你的屏幕高度(行數)
LOGNAME=LinuxTechi
當前登錄用戶的名字
OSTYPE=Linux
操作系統類型
PATH=/usr/bin:/sbin:/bin:/usr/sbin
可執行文件搜索路徑
PS1=[\u@\h \W]\$
命令行提示符
PWD=/home/linuxtechi
當前工作目錄
SHELL=/bin/bash
Shell 名稱
USERNAME=linuxtechi
當前登錄的用戶名
要列印以上變數的值,可以使用echo command命令,如下:
# echo $HOME# echo $USERNAME
我們可以通過在環境變數名前前置一個美元符號來從你的腳本里輸入環境變數。請看下面腳本演示:
$ cat myscript #!/bin/bash# display user information from the system.echo 「User info for userid: $USER」echo UID: $UIDecho HOME: $HOME
注意:echo命令中的環境變數在腳本運行時會被它們的值替代。同時注意,我們可以再第一個字元串的雙引號中放置$USER系統變數,而shell腳本仍然可以明白我們的意思。然而,該方法有一個缺點。看下面這個例子:
$ echo 「The cost of the item is $15」The cost of the item is 5
很明顯,那不是我們說希望的。無論何時,當腳本遇見引號中的美元符號時,它都會認為你是在調用一個變數。在本例中,該腳本試著顯示變數$1(而這個變數並沒有定義),然後顯示數字5。要顯示實際上的美元符號,你必須前置一個反斜線字元:
$ echo 「The cost of the item is \$15」The cost of the item is $15
那樣好多了。反斜線允許shell腳本將美元符號解釋成為實際的美元符號,而不是變數。
用戶定義的變數:
這些變數由用戶定義。shell腳本允許我們在腳本中設置並使用我們自己的變數。設置變數允許你臨時存儲數據並在腳本中使用,讓shell腳本看起來像一個真正的計算機程序。
用戶變數可以是任何不超過20個的字母、數字或者下劃線字元的文本字元串(LCTT 譯註:變數只能以字母或下劃線開頭)。用戶變數是大小寫敏感的,因此,變數Var1和變數var1是不同的變數。這個小規則常常讓新手編寫腳本時麻煩重重。
我們可以通過等於號為變數賦值。變數,等於號和值(對於新手又是個麻煩的地方)之間不能有空格。下面是幾個給用戶變數賦值的例子:
var1=10var2=-57var3=testingvar4=「still more testing」
shell腳本為變數值自動確定數據類型。shell腳本內定義的變數會在腳本運行時保留它們的值,當腳本完成後則刪除這些值。
就像系統變數一樣,用戶變數也可以使用美元符號來調用:
$ cat test3#!/bin/bash# testing variablesdays=10guest="Katie"echo "$guest checked in $days days ago"days=5guest="Jessica"echo "$guest checked in $days days ago"$
運行腳本會產生以下輸出:
$ chmod u+x test3$ ./test3Katie checked in 10 days agoJessica checked in 5 days ago$
每次變數被調用,它都會變成了當前分配給它的值。有一點很重要,當調用一個變數值時,你使用美元符號,但是當為一個變數分配一個值時,你不能用美元符號。下面用例子來說明:
$ cat test4#!/bin/bash# assigning a variable value to another variablevalue1=10value2=$value1echo The resulting value is $value2$
當你使用賦值語句中value1變數的值時,你仍然必須使用美元符號。這段代碼產生了如下輸出:
$ chmod u+x test4$ ./test4The resulting value is 10$
如果你忘了美元符號,而又讓value2賦值行看起來像這樣:
value2=value1
你會獲得下面的輸出:
$ ./test4 The resulting value is value1$
沒有美元符號,shell解釋變數名為普通文本字元串,這極有可能不是你想要的。
在shell變數中使用反引號(`):
反引號允許你將shell命令的輸出賦值給變數。雖然這似乎沒什麼大不了,但它是腳本編程中主要的構建基塊。你必須使用反引號將整個命令行包含起來:
**testing=`date`**
shell會在反引號中運行命令,然後將輸出結果賦值給變數testing。下面的例子給出了如何使用一個常規shell命令的輸出結果來創建一個變數:
$ cat test5#!/bin/bash# using the backtick charactertesting=`date`echo "The date and time are: " $testing$
變數testing接收來自date命令的輸出結果,而它又在echo語句中被調用。運行腳本會產生如下輸出:
$ chmod u+x test5$ ./test5The date and time are: Mon Jan 31 20:23:25 EDT 2011
註:在bash中,你也可以選用$(...)語法來替換反引號(`),它有個優點就是可以重用(re-entrant)。
例:
$ echo " Today』s date & time is :" $(date)Today』s date & time is : Sun Jul 27 16:26:56 IST 2014
③ 如何用shell獲取linux目錄下的文件名
獲取所有常規文件的文件名並列印出來的腳本listfile.sh如下
#!/bin/bash
dir="/*"
dir=$1$dir
for f in $dir
do
if [ -f $f ]
then
echo $f
fi
done
使用方法:
$ listfile.sh PATH
原理:
PATH參數是路徑,將路徑後加上「/*」,代表該目錄下的所有文件和目錄名,利用for循環比較每個文件是否是常規文件( -f比較運算符),若if表達式為真則列印
舉例:
ls -l
total 36
-rwxrwxr-x 1 lipeng lipeng 48 Nov 29 20:08 aaa.sh
drwxrwxr-x 2 lipeng lipeng 4096 May 4 2015 byteorder
drwxrwxr-x 8 lipeng lipeng 4096 May 3 2015 hello
-rwxrwxr-x 1 lipeng lipeng 122 Nov 29 20:16 listfile.sh
-rw-rw-r-- 1 lipeng lipeng 177 Aug 1 03:10 main.cpp
drwxrwxr-x 2 lipeng lipeng 4096 Sep 13 16:42 matrix
drwxrwxr-x 5 lipeng lipeng 4096 Apr 28 2015 modbus
drwxrwxr-x 2 lipeng lipeng 4096 Sep 13 10:10 shtest
drwxrwxr-x 2 lipeng lipeng 4096 Sep 16 18:21 test
$ ./listfile.sh .
./aaa.sh
./listfile.sh
./main.cpp
④ shell程序查找出a文件夾中的最後修改的文件,並讀出文件名,用變數保存
filename=`ls /home/test/ -ltr |tail -1|awk '{print $NF}'`
/home/test/ 替換為你的目錄 -ltr就是按修改時間排序 tail -1 取最回後一行 awk用於取文件名答
⑤ 編寫一個shell腳本,將自變數形式給出的目錄下所有文件的文件名、大小和最後修改時間列出,並保存到文件中
#!/bin/sh
export LANG=en_US
ls -l $1 |grep ^-|awk '{printf "%30s\t%s\t%s\n",$9, $5 ,$8}'
⑥ shell下怎麼循環獲取某目錄下的文件名,放入變數並循環列印變數 萬分感謝。
#!/bin/bash
path=$1 #這里的$1,換成你需要的路徑名,或者你不換,通過shell的參數傳入
cd $path
for filename in `ls`
do
echo $filename
done
⑦ 如何在shell腳本中使用變數
系統定義的變數:
這些變數由操作系統(Linux)自身創建並維護,通常它們以大寫字母定義,我們可以通過命令「$ set」來查看這些變數。下面列出了部分系統定義的變數:
系統定義的變數
意義
BASH=/bin/bash
Bash Shell 名稱
BASH_VERSION=4.1.2(1)
Bash 版本
COLUMNS=80
你的屏幕寬度(列數)
HOME=/home/linuxtechi
用戶家目錄
LINES=25
你的屏幕高度(行數)
LOGNAME=LinuxTechi
當前登錄用戶的名字
OSTYPE=Linux
操作系統類型
PATH=/usr/bin:/sbin:/bin:/usr/sbin
可執行文件搜索路徑
PS1=[\u@\h \W]\$
命令行提示符
PWD=/home/linuxtechi
當前工作目錄
SHELL=/bin/bash
Shell 名稱
USERNAME=linuxtechi
當前登錄的用戶名
要列印以上變數的值,可以使用echo command命令,如下:
# echo $HOME# echo $USERNAME
我們可以通過在環境變數名前前置一個美元符號來從你的腳本里輸入環境變數。請看下面腳本演示:
$ cat myscript #!/bin/bash# display user information from the system.echo 「User info for userid: $USER」echo UID: $UIDecho HOME: $HOME
注意:echo命令中的環境變數在腳本運行時會被它們的值替代。同時注意,我們可以再第一個字元串的雙引號中放置$USER系統變數,而shell腳本仍然可以明白我們的意思。然而,該方法有一個缺點。看下面這個例子:
$ echo 「The cost of the item is $15」The cost of the item is 5
很明顯,那不是我們說希望的。無論何時,當腳本遇見引號中的美元符號時,它都會認為你是在調用一個變數。在本例中,該腳本試著顯示變數$1(而這個變數並沒有定義),然後顯示數字5。要顯示實際上的美元符號,你必須前置一個反斜線字元:
$ echo 「The cost of the item is \$15」The cost of the item is $15
那樣好多了。反斜線允許shell腳本將美元符號解釋成為實際的美元符號,而不是變數。
用戶定義的變數:
這些變數由用戶定義。shell腳本允許我們在腳本中設置並使用我們自己的變數。設置變數允許你臨時存儲數據並在腳本中使用,讓shell腳本看起來像一個真正的計算機程序。
用戶變數可以是任何不超過20個的字母、數字或者下劃線字元的文本字元串(LCTT 譯註:變數只能以字母或下劃線開頭)。用戶變數是大小寫敏感的,因此,變數Var1和變數var1是不同的變數。這個小規則常常讓新手編寫腳本時麻煩重重。
我們可以通過等於號為變數賦值。變數,等於號和值(對於新手又是個麻煩的地方)之間不能有空格。下面是幾個給用戶變數賦值的例子:
var1=10var2=-57var3=testingvar4=「still more testing」
shell腳本為變數值自動確定數據類型。shell腳本內定義的變數會在腳本運行時保留它們的值,當腳本完成後則刪除這些值。
就像系統變數一樣,用戶變數也可以使用美元符號來調用:
$ cat test3#!/bin/bash# testing variablesdays=10guest="Katie"echo "$guest checked in $days days ago"days=5guest="Jessica"echo "$guest checked in $days days ago"$
運行腳本會產生以下輸出:
$ chmod u+x test3$ ./test3Katie checked in 10 days agoJessica checked in 5 days ago$
每次變數被調用,它都會變成了當前分配給它的值。有一點很重要,當調用一個變數值時,你使用美元符號,但是當為一個變數分配一個值時,你不能用美元符號。下面用例子來說明:
$ cat test4#!/bin/bash# assigning a variable value to another variablevalue1=10value2=$value1echo The resulting value is $value2$
當你使用賦值語句中value1變數的值時,你仍然必須使用美元符號。這段代碼產生了如下輸出:
$ chmod u+x test4$ ./test4The resulting value is 10$
如果你忘了美元符號,而又讓value2賦值行看起來像這樣:
value2=value1
你會獲得下面的輸出:
$ ./test4 The resulting value is value1$
沒有美元符號,shell解釋變數名為普通文本字元串,這極有可能不是你想要的。
在shell變數中使用反引號(`):
反引號允許你將shell命令的輸出賦值給變數。雖然這似乎沒什麼大不了,但它是腳本編程中主要的構建基塊。你必須使用反引號將整個命令行包含起來:
**testing=`date`**
shell會在反引號中運行命令,然後將輸出結果賦值給變數testing。下面的例子給出了如何使用一個常規shell命令的輸出結果來創建一個變數:
$ cat test5#!/bin/bash# using the backtick charactertesting=`date`echo "The date and time are: " $testing$
變數testing接收來自date命令的輸出結果,而它又在echo語句中被調用。運行腳本會產生如下輸出:
$ chmod u+x test5$ ./test5The date and time are: Mon Jan 31 20:23:25 EDT 2011
註:在bash中,你也可以選用$(...)語法來替換反引號(`),它有個優點就是可以重用(re-entrant)。
例:
$ echo " Today』s date & time is :" $(date)Today』s date & time is : Sun Jul 27 16:26:56 IST 2014