① 求Bash shell命令
at----安排,檢查,刪除隊列中的工作
cat----連接文件並列印到標准輸出
cd----改變目錄,能處理絕對和相對路徑
chmod----改變文件保護許可權
chown----改變文件的屬主和組
clear----清除屏幕(象DOS中的cls)
cp----拷貝文件
crontab----操作每個用戶的守護程序和執行的時間表
date----列印或設置系統日期和時間
dd----拷貝一個文件(並可以同時轉化它)
df----報告磁碟剩餘空間
----報告磁碟空間使用情況
file----探測文件和目錄類型
find----搜索目錄中文件
grep----在文件中搜索匹配的行並輸出
gzip----壓縮或展開文件
head----顯示文件的前幾行
history----顯示歷史命令記錄
kill----中止一個進程
last----顯示過去多少個用戶或終端登錄到本機器
less----想對於more命令, 用來按頁顯示文件
ln----在文件間建立連接
ls----列出當前目錄下的文件
man----顯示具有一定格式的在線手冊
more----命令能逐頁閱讀文本
mount----安裝一個文件系統
mv----將文件改名
passwd----設置用戶的密碼
ps----命令羅列運行進程
reboot----重新啟動系統
rm----命令用於刪除文件
su----創建和編輯Unix歸檔文件
tar----創建和編輯Unix歸檔文件
touch----改變文件的時間參數
wc----統計一個文件中的位元組數,單詞數,行數
who----查看其他登錄的用戶
which----which--顯示命令的全路徑
ping----命令—確定網路上機器是否可達或到達速率
使用多任務
輸出重定向
了解進程
--------------------------------------------------------------------------------
在linux系統中有兩種操作界面,分別是:X窗口模式(預設為KDE)和控制台模式(Console)。兩中操作界面類似於Windows和DOS。
如果在X窗口模式下想轉變為控制台模式,您只需同時按下Alt+F1(或F2…F6)鍵,屏幕將會出現新的等錄窗口,您可以重新以控制台模式登錄系統。如果在控制台模式下,要想返會X窗口模式,需要您同時按下Ctrl+Alt+F7鍵。
如果沒有啟動X窗口方式,想從控制台方式中啟動X窗口方式,請在控制台方式中輸入:startx(或kdm),就可以啟動X窗口。
在上面兩章中我們已經介紹了X窗口(預設為KDE)的操作,在本章和下一章中我們將主要討論控制台模式下的操作,同時也將會間插相應的KDE操作。
6.1 啟動和關閉系統
啟動系統
如果您在安裝過程中已經安裝了LILO, 您就可以啟動系統,LILO啟動時,屏幕顯示:
LILO:
單擊Tab鍵,屏幕將顯示所有可以啟動的操作系統。鍵入顯示的操作系統名,您就可以啟動相應操作系統。鍵入Linux可啟動BluePoint Linux&127;系統。如果您直接擊回車鍵或等待5秒鍾,同樣可以啟動BluePoint Linux&127;操作系統。
另一種啟動linux系統的方法是:在DOS/WINDOWS系統下運行loadlin.exe。具體使用方法參見相應資料。
登錄程序
Linux系統是多用戶系統。如果想使用系統,就要鑒別使用者身份進行鑒別,這就是所謂的注冊程序。在安裝過程中,我們已經創建了叫root超級用戶帳號。啟動系統後,在登錄命令行,鍵入root,再輸入密碼("Password")。如果密碼正確,登錄成功。
建議: 進入系統後建立第二個帳號(非特權用戶),以便日常使用。
因為root帳號擁有整個系統的資源所有權,是管理帳號而非工作帳號。
如果您要創建工作帳號,需要兩個步驟:
第一步: 創建用戶注冊帳號。
鍵入:adsr login_name
其中login_name是您選擇的注冊帳號(不要使用root)。
第二步: 創建帳號密碼。
鍵入:passwd login_password
其中login_password是您選擇的帳號密碼(最好不要 和root密碼相同)。
如果普通用戶要想使用系統的所有特權,使用su命令,並在root命令行中輸入 root密碼。另外,您還可以使用超級用戶模式文件管理器來獲取系統資源, 使用方法是:
「K菜單」-->」系統應用」-->」文件管理器(超級用戶方式)」
如果您的同事(家庭成員…)要使用您計算機系統,應該為這些用戶創建新的用戶帳號,而不能將root帳號告訴他們。注意:您要充分利用Linux是多用戶操作系統這個優點。
關閉系統
關閉系統的方法有很多,但千萬不要直接關斷電源!
因為,Linux是使用緩存和磁碟(硬碟,軟盤…)來加速輸入/輸出的;如果直接關斷電源,存起來的數據可能沒有真正寫到磁碟,可能會導致數據丟失。
正確關閉系統是下面幾種:
鍵入/sbin/halt命令(或直接鍵入halt),等待系統掛起的消息(systemhalted)再關閉系統
快速關閉系統方法是同時按下Ctrl+Alt+Del鍵(象DOS一樣),系統將卸載所有外圍設備,並等待計算機重初始化時,再關斷電源 。
使用KDM會話。在桌面上任意位置單擊右鍵,選擇「注銷」。再選擇"關閉"系統或"重啟"系統。
如果直接關斷電源或發生掉電,會出現什麼情況呢?Linux重新啟系統時會檢查未正確卸載的磁碟(fsck 操作)。持續幾分鍾後。系統可能才會正確啟動。
6.2 Linux 的shells
一旦進入系統,您將會看到$的提示符,提示您鍵入命令。這個等待命令的程序叫shell,其作用是將指令傳送給Linux的內核。
Linux系統中有許多不同shell: bash,csh,ksh,tcsh,sh,zsh…..。
在BluePoint Linux&127;系統系統中,shell選用"Bash",因為Bash shell簡單並且功能強大。
如果您想知道目前使用的是那種shell,您只要簡單鍵入: echo $SHELL
可以發現系統正在使用的shell類型。
注意:不同的shell有不同的語法。
6.3 使用Bash shell
和DOS系統一樣, Linux系統控制台也採用命令行方式。需要在控制台上輸入命令,才會執行。
快捷方式
通用的鍵盤快捷方式是:
. Ctrl+A 到開始行
. Ctrl+U 清除目前行
. Ctrl+C 停止運行的程序
.使用分號能在同一行中鍵入幾個命令。
.上下鍵能獲取命令歷史記錄。
自動名字補全
在Linux系統下,程序和命令名有時十分長,Bash支持自動名字補全功能。
您開始鍵入命令名字,再擊Tab鍵,系統將為您自動補全命令或程序或目錄名字。
例如: 如果您要使用解壓程序bunzip。鍵入
$bu
接著擊Tab鍵:Bash將顯示所有以bu開始的名字。例如:
buildhash buildin bunzip
鍵入n (bunzip2是唯一名字第三個字元是n),再擊Tab鍵。shell將為您在命令行補全名字,您只要擊回車鍵就可以執行bunzip2命令了。
at命令
at,batch,atq,atrm:安排,檢查,刪除隊列中的工作。
at [-V][-q 隊列][-f 文件名][-mlbv ] 時間
at -c 作業 [作業…]
atq [-V] [-q隊列][-v]
atrm [-V] 作業 [作業…]
batch [-V] [-q隊列] [-f 文件名] [-mv ] [時間]
at在設定時間執行作業。
atq列出用戶排在隊列中的作業,如果是超級用戶,就列出隊列中所有的作業。
atrm 刪除隊列中的作業。
batch 用低優先順序運行作業,只要系統的loadavg(系統平均負載)<1.5(或者在atrun中設定的值),它就可開始執行作業。
超級用戶可以在任何情況下使用at系列的命令。一般用戶使用at系列命令的許可權由文件/etc/at.allow,/etc/at.deny控制。如果/etc/at.allow存在,則只有列在這個文件中的用戶才能使用at系列命令。如果/etc/at.allow文件不存在,則檢查文件/etc/at.deny這個文件。只要不列在這個文件中的用戶都可以使用at系列的命令。預設的配置是文件/etc/at.deny是一個空文件,這表明所有的用戶都可以使用a系列的命令。
例如:
在二天後上午8點執行文件workfile中的作業。
[test@bluepoint /]$at -f workfile 8am+2 days
cat命令
cat---連接文件並列印到標准輸出。
cat常常用來顯示文件,類似於DOS下命令TYPE。
例如:
顯示文件file的內容
[test@bluepoint /]$cat file
將file1,file2連接起來輸出到文件file3中。
[test@bluepoint /]$cat file1 file2>file3
cd命令
cd---改變目錄,能處理絕對和相對路徑。
例如:
假如當前在根目錄中,想進入etc/子目錄。鍵入(相對目錄):
[test@bluepoint /]$cd etc/
如果想進入/usr/bin目錄,鍵入(絕對目錄):
[test@bluepoint /]$cd /usr/bin/
此命令一些實用選項是:
回到父目錄(注意cd和.. 之間有空格)
[test@bluepoint /]$cd ..
回到目前目錄了。
[test@bluepoint /]$cd .
cd ~ 到達個人目錄
[test@bluepoint /]$cd ~
chmod命令
chmod-- 改變文件保護許可權
文件保護控制用戶對文件的訪問權,有三個安全級別:所有者級別,組訪問級別,其它用戶訪問級別。在這三個級別中,又有三種許可權:讀(r),寫(w),執行(x)。(用戶可以使用ls -lg 命令來觀看某一文件的所屬的group)。
對於文件來說讀許可權意味著可以看文件的內容,寫文件權可以修改或刪除文件,執行許可權則可以執行它。對於目錄來說,讀許可權意味可以查看目錄下的內容,寫許可權意味著可以在目錄中建立新文件,並可以從目錄中刪除文件,執行許可權意味著可以從一個目錄轉到另一個目錄。
保護許可權:格式為[ugoa][[+-=][rwxXstugo…]…][….]"ugoa"控制哪些用戶對該文件許可權將會改變:(u)文件的所有者,(g)與文件所有者同組的用戶,(0)其它組的用戶,(a)所有用戶。操作符"+"使得用戶許可權被追加到每個目錄文件。操作符"-"使得用戶許可權被取消,操作符"="使用戶只有這些許可權。"rwxXstugo"選擇新的屬性:(r)讀許可權(w)寫許可權(x)執行許可權(和對目錄的訪問權)(X)只有目標文件對某些用戶是可執行的或該目標文件是目錄時才追加X屬性(s)同時設定用戶或組ID(t)保存程序的文本到交換設備上(u)目標文件屬主(g)目標文件屬主所在的組(o)其它用戶。如果數字來表示屬性,則(0)沒有許可權(1)執行權(2)讀權(4)寫權,然後相加,所以數字屬性的格式應為3個0到7的八進制數,其順序是(u)(g)(o)文件名:以空格分開的要改變許可權的文件列表,支持通配符。
範例:
使所有用戶對文件testfile有執行權
[test@bluepoint /]$chmod a+x testfile
使所有用戶對文件testfile讀權
[test@bluepoint /]$chmod 222 testfile
chown 命令
chown --改變文件的屬主和組。
用戶:可以是用戶名或用戶ID。
組:可以是組名或組的ID。
文件名:以空格分開的要改變許可權的文件列表,支持通配符。
例如:
[test@bluepoint /]$ chown host:test file1
將文件file1的屬主改為host組的test。
clear命令
clear--清除屏幕(象DOS中的cls)。
例如:
[test@bluepoint /] $clear
清除屏幕,提示符將被移到左上角。
cp 命令
cp--拷貝文件
用法:
cp [options] 源文件 目標文件
選項:
-f,--force:強行覆蓋已存在的目標文件
-i,-interactive:在強行覆蓋已存在的目標文件時給出提示。
-R,--recursive:整個目錄拷貝。
例如:
[test@bluepoint /]cp sourcefile destfile
拷貝文件sourcefile到文件destfile。
crontab命令
crontab--操作每個用戶的守護程序和執行的時間表。
crontab file [-u user]--用指定的文件替代目前的crontab。
crontab - [-u user]--用標准輸入替代目前的crontab。
crontab -l [user]--列出用戶目前的crontab。
crontab -e [user]--編輯用戶目前 的crontab 。
crontab -d [user]--刪除用戶目前 的crontab 。
crontab -c dir --指定crontab的目錄。
crontab文件的格式:M H D m d cmd
M:分鍾(0-59)
H:小時(0-23)
D:天(1-31)
m:月份(1-12)
d:一星期內的天(0-6,0為星期天)
cmd:要運行的程序,程序被送入shell執行,這個shell只有USER,HOME,SHELL三個環境變數。
例如:
列出用戶目前的crontab
[test@bluepoint /]$crontab -l
$MIN HOUR DAY MOUTH DAYOFWEEK COMMAND
8 6 * * * clear
[test@bluepoint /]$
date命令
date--列印或設置系統日期和時間
date [-u] [-d datestr] [-s datestr] [--utc][--universal][--date=datestr][--set=datestr] [--help][--version][+FORMAT][MMDDhhmm[[CC]YY][。ss]]
+FORMAT:控制如何顯示日期。
指令: % :%號
n:新行
t:TAB
時間域
%H 小時 (00..23)
%l 小時 (00..12)
%k 小時 (0..23)
%l 小時 (1..12)
%M 小時 (00..59)
%p AM或者PM
%r
② badboy腳本中,迭代時多個參數的值如何同時變化
之所以用到命令行參數,關鍵在於shell腳本需要與運行腳本的人員進行交互。
bash shell提供了命令行參數添加在命令後面的數據值)、命令行選項修改命令行為的單字元值)和直接讀取鍵盤輸入。
1、命令行參數
向shell腳本傳遞數據的最基本方式是使用命令行參數。
1)讀取參數
讀取輸入的參數的變數為位置參數,位置參數通過標准數字表示,
其中$0為程序名稱,$1為第一個參數,$2為第二個參數,依次類推,直到$9為第九個參數。
shell腳本自動將命令行參數賦值給各個位置變數。
同時輸入多個參數可以是數值也可以是字元串)時,必須使用空格分隔要想在參數值中包含空格,就必須使用單引號或雙引號)
當參數多於9個後,必須在shell腳本內使用大括弧將變數括起來,如${10}。從而可以使用任意個參數。
2)讀取程序名稱
傳遞給變數$0的字元串實際上是程序的路徑根據調用方法決定是相對還是絕對路徑)。
使用basename命令可以去掉路徑前綴,只獲得程序名稱名字中不 可以有空格)。
3)測試腳本
當腳本認為應該包含參數,卻實際上沒有數據時,就會出錯。
好的方法是對參數進行檢查來保證使用參數前確實存在數據,可以使用-n參數來檢查。
例子:if [ –n 「$1」 ] then .. else .. fi
2、特殊的參數變數
用於跟蹤命令行參數
1)參數計數
使用特殊變數$#測試執行腳本時包含的命令行參數個數。腳本中任何位置都可以 使用$#
例子:if [ $# –ne 2 ] 即可測試參數個數
可以使用${!#}來返回最後一個命令行參數當無參數時,$#為0,而${!#}為程序名)
2)獲取所有數據
變數$*將命令行中提供的所有參數作為一個單詞處理,它將多個參數看成 一個參數。
變數$@將命令行中提供的所有參數作為同一個字元串中的多個單詞處理。 允許對其中的值進行迭代一般使用for),分隔開不同參數
3、移位
shift命令能夠改變命令行參數的相對位置。默 認將每個參數變數左移一個位置變數$0不變,把$1丟棄,注意不可以恢復了!)
在不清楚參數數目情況下,這是一個迭代參數的好辦法。
可以為shift提供一個參數,來實現多位移變化。
4、處理選項
選項是由破折號引導的單個字母,用於更改命令的行為。
1,找出選項
1)處理簡單選項
可以使用處理命令行參數相同的方法處理選項,抽取時使用case語句進行判斷是否符合選項格式。
2)從參數中分離選項
同時使用選項和參數時,可以使用--指示選項列表的結束。發現--後,shell就知道後面的是普通參數了,停止使用case處理選項。
3)處理帶值的選項
選項後緊跟參數值,一種方法是在case中對應選項後使用shift和讀後一位參數的方法處理。更好的方法如 下:
2,使用getopt命令
getopt命令在處理選項和參數時非常方便。它對參數進行重新組 織,以便於解析
1)命令格式
getopt可以接受任意形式的選項和參數列表,並自動將它們轉換為適當的格式。
命令格式為: getopt options optstring parameters
選項字元串(opstring)用於定義命令行中的有效選項字母,以及哪些選項字母需要參數值。
2)腳本中使用getopt
需要使用set命令將現有的命令行選項和參數替換為getopt命令生成的 格式化形式。
需要將原始腳本命令行參數送給getopt命令,然後將getopt命令輸出送給set命令,如下:set – `getopts –q ab:cd 「$@」`
但是getopt命令不能很好的處理帶有空格的參數值,它將空格解析為參數分隔符,而不是將雙引號引起來的兩個 值合並成一個參數。解決辦法如下:
3)更高級的getopts命令
getopts命令順序的對現有的shell參數變數進行處理,每調用一次,只處理命令中檢測到的參數中的一個。處理完所有參數後,以大於0的退出 狀態退出。
非常適宜於在循環中解析所有命令行參數
格式為: getopts optstring variable
$optarg包含需要參數值的選項要使用的值,$optind包含getopts停止處理時在參數列表中的位置。
③ 編寫一個shell腳本程序,它帶一個命令行參數,這個參數是一個文件。
#!/bin/bash
#腳本名稱假設為:test.sh
if [[ $# -ne "1" || ! -f $* ]];then
echo "Usage:./test.sh 參數(請輸入普通文件名)"
exit 1
fi
uname=$(ls -l $1 | awk '{print $3}')
ctime=$(ls -l $1 --full-time | awk '{print $6}')
echo "所有者為:$uname"
echo "最後修改的日期:$ctime"
④ 使用bash腳本,使用for循環和arg參數編寫一個實現將命令行的多個參數逆序輸出的程序
腳本自己寫了一個,可能不完全符合條件2要求(cmd變數沒用上),但是逆序列印詞串大概沒問題,你自己試下:
#!/bin/bash
count=$#
for arg in $*
do
echo -n "${count} "
let "count=count-1"
done
第一個問題的答案:vi,或者你寫vim也對,一般vi是vim的鏈接,運行命令行下的vi編輯器。
第二個問題沒看明白要cmd這個變數啥用,可能是我愚鈍,我不知道怎樣重定向一個字元串追加到一個變數的末尾,想了個變通的方法。
第三個問題的答案:chmod 0750 /<到腳本位置的絕對路徑>/<腳本文件名>
第四個問題的答案:你把這串字元按照空格隔開為一個單元的規律倒序寫即可,就是這樣ddff gdd ddd ac ab aa
⑤ 在bash shell里 $0 $ $* $@ 各表示什麼意思
$0就是該bash文件名,
$?是上一指令的返回值,
$*所有位置參數的內容:就是調用調用本bash shell的參數。
$@基本上與上面相同。
「$*」返回的是一個字元串,字元串中存在多外空格。
「$@」返回多個字元串。
(5)bash命令行參數擴展閱讀:
bash shell 的內置命令: type
語法:type [-tpa] name
參數:
type: 不加任何參數時, type會顯示name是外部命令還是bash內置命令
-t: 當加入-t 參數時, type會將name以下面這些字眼顯示出它的意義:
file:表示為外部命令;
alias: 表示該命令為命令別名所設置的名稱
builtin : 表示該命令為bash內置的命令功能
-p: 如果後面接的name為外部命令時, 才會顯示完整文件名
-a :會由PATH變數定義的路徑中,將所有含name的命令都列出來,包含alias
type主要在找出「執行文件」而不是一般文件名。所以,這個type也可以用來作為類似which命令的用途。
⑥ Bash cp 命令參數引用變數,求指教
cp $c ~/Desktop/B/ 改成 cp "$c" ~/Desktop/B/
⑦ bash命令行中帶通配符參數何時展開
非常奇妙的問題,答案同樣也很有趣(蛋疼。。。) 「 當使用類似於[a-z]的范圍表達式時,取決於LC_COLLATE設置的不同,可能會包含大寫字母。」 你可以測試以下命令(我用 bash 4.3.11 測試過): $ touch a A b B c C x X y Y z Z$ lsa A b B c C ...
⑧ linux中設計一個shell腳本程序可以接受命令行輸入的參數執行相應的菜單命令
echo "------------------------"
echo "1、命令1"
echo "2、命令2"
echo "3、命令3"
echo "------------------------"
echo "請輸入要執行的菜單命令(1/2/3):"
read com
case $com in
1)
命令1
;;
2)
命令2
;;
3)
命令3
;;
*)
echo "輸入命令錯誤"
;;
⑨ 能把這個linux shell命令的每個參數給解釋一下么
問題描述:在linux shell中如何處理tail -n 10 access.log這樣的命令行選項?
在bash中,可以用以下三種方式來處理命令行參數,每種方式都有自己的應用場景。
1,直接處理,依次對$1,$2,...,$n進行解析,分別手工處理;
2,getopts來處理,單個字元選項的情況(如:-n 10 -f file.txt等選項);
3,getopt,可以處理單個字元選項,也可以處理長選項long-option(如:--prefix=/home等)。
總結:小腳本手工處理即可,getopts能處理絕大多數的情況,getopt較復雜、功能也更強大。
1,直接手工處理位置參數
必須要要知道幾個變數,
復制代碼代碼如下:
* $0 :即命令本身,相當於c/c++中的argv[0]
* $1 :第一個參數.
* $2, $3, $4 ... :第2、3、4個參數,依次類推。
* $# 參數的個數,不包括命令本身
* $@ :參數本身的列表,也不包括命令本身
* $* :和$@相同,但"$*" 和 "$@"(加引號)並不同,"$*"將所有的參數解釋成一個字元串,而"$@"是一個參數數組。
手工處理方式能滿足多數的簡單需求,配合shift使用也能構造出強大的功能,但處理復雜選項時建議用下面的兩種方法。
例子,(getargs.sh):
復制代碼代碼如下:
#!/bin/bash
if [ $# -lt 1 ]; then
echo "error.. need args"
exit 1
fi
echo "commond is $0"
echo "args are:"
for arg in "$@"
do
echo $arg
done
運行命令:
復制代碼代碼如下:
./getargs.sh 11 22 cc
commond is ./getargs.sh
args are:
11
22
cc
2,getopts (shell內置命令)
處理命令行參數是一個相似而又復雜的事情,為此,c提供了getopt/getopt_long等函數,c++的boost提供了options庫,在shell中,處理此事的是getopts和getopt。
getopts/getopt的區別,getopt是個外部binary文件,而getopts是shell builtin。
復制代碼代碼如下:
[root@jbxue ~]$ type getopt
getopt is /usr/bin/getopt
[root@jbxue ~]$ type getopts
getopts is a shell builtin
getopts不能直接處理長的選項(如:--prefix=/home等)
關於getopts的使用方法,可以man bash 搜索getopts
getopts有兩個參數,第一個參數是一個字元串,包括字元和「:」,每一個字元都是一個有效的選項,如果字元後面帶有「:」,表示這個字元有自己的參數。getopts從命令中獲取這些參數,並且刪去了「-」,並將其賦值在第二個參數中,如果帶有自己參數,這個參數賦值在「optarg」中。提供getopts的shell內置了optarg這個變變,getopts修改了這個變數。
這里變數$optarg存儲相應選項的參數,而$optind總是存儲原始$*中下一個要處理的元素位置。
while getopts ":a:bc" opt #第一個冒號表示忽略錯誤;字元後面的冒號表示該選項必須有自己的參數
例子,(getopts.sh):
復制代碼代碼如下:
echo $*
while getopts ":a:bc" opt
do
case $opt in
a ) echo $optarg
echo $optind;;
b ) echo "b $optind";;
c ) echo "c $optind";;
? ) echo "error"
exit 1;;
esac
done
echo $optind
shift $(($optind - 1))
#通過shift $(($optind - 1))的處理,$*中就只保留了除去選項內容的參數,可以在其後進行正常的shell編程處理了。
echo $0
echo $*
執行命令:
復制代碼代碼如下:
./getopts.sh -a 11 -b -c
-a 11 -b -c
11
3
b 4
c 5
5
./getopts.sh
3,getopt(一個外部工具)
具體用用法可以 man getopt
#-o表示短選項,兩個冒號表示該選項有一個可選參數,可選參數必須緊貼選項,如-carg 而不能是-c arg
#--long表示長選項
例子,(getopt.sh):
復制代碼代碼如下:
#!/bin/bash
# a small example program for using the new getopt(1) program.
# this program will only work with bash(1)
# an similar program using the tcsh(1) script. language can be found
# as parse.tcsh
# example input and output (from the bash prompt):
# ./parse.bash -a par1 'another arg' --c-long 'wow!*\?' -cmore -b " very long "
# option a
# option c, no argument
# option c, argument `more'
# option b, argument ` very long '
# remaining arguments:
# --> `par1'
# --> `another arg'
# --> `wow!*\?'
# note that we use `"$@"' to let each command-line parameter expand to a
# separate word. the quotes around `$@' are essential!
# we need temp as the `eval set --' would nuke the return value of getopt.
#-o表示短選項,兩個冒號表示該選項有一個可選參數,可選參數必須緊貼選項
#如-carg 而不能是-c arg
#--long表示長選項
#"$@"在上面解釋過
# -n:出錯時的信息
# -- :舉一個例子比較好理解:
#我們要創建一個名字為 "-f"的目錄你會怎麼辦?
# mkdir -f #不成功,因為-f會被mkdir當作選項來解析,這時就可以使用
# mkdir -- -f 這樣-f就不會被作為選項。
temp=`getopt -o ab:c:: --long a-long,b-long:,c-long:: \
-n 'example.bash' -- "$@"`
if [ $? != 0 ] ; then echo "terminating..." >&2 ; exit 1 ; fi
# note the quotes around `$temp': they are essential!
#set 會重新排列參數的順序,也就是改變$1,$2...$n的值,這些值在getopt中重新排列過了
eval set -- "$temp"
#經過getopt的處理,下面處理具體選項。
while true ; do
case "$1" in
-a|--a-long) echo "option a" ; shift ;;
-b|--b-long) echo "option b, argument \`$2'" ; shift 2 ;;
-c|--c-long)
# c has an optional argument. as we are in quoted mode,
# an empty parameter will be generated if its optional
# argument is not found.
case "$2" in
"") echo "option c, no argument"; shift 2 ;;
*) echo "option c, argument \`$2'" ; shift 2 ;;
esac ;;
--) shift ; break ;;
*) echo "internal error!" ; exit 1 ;;
esac
done
echo "remaining arguments:"
for arg do
echo '--> '"\`$arg'" ;
done
運行命令:
復制代碼代碼如下:
./getopt.sh --b-long abc -a -c33 remain
option b, argument `abc'
option a
option c, argument `33'
remaining arguments:
--> `remain'
以上提供參考學習,謝謝!
⑩ 使用bash腳本,編寫一個實現將命令行的多個參數逆序輸出的程序。
i=$#
while[$i-gt0]
do
eval"echo$$i"
i=$((i-1))
done