linux語法
1. linux常見命令
許可權管理命令 chmod
英文願意: change the permissions mode of a file
語法: chmod[{ugoa}{+-=}{rwx}] [文件或目錄]
[mide = 421] [文件或目錄]
-R 遞歸修改
許可權的數字表示
r -- 4
w -- 2
x -- 1
rwxrw-r-- (4+2+1 = 7)
7 6 4
例子:mkdir /temp 創建了一個目錄
touch /temp/testfile 在該目錄下創建了一個test file文件
chmod 777 /temp 改變了一下該目錄的許可權
名稱: chgrp
英文原意:change file group ownership
語法:chgrp [用戶][文件或目錄]
功能: 改變文件或目錄的所屬租
例子: useradd hl // 添加所有者
groupadd brother // 添加所有組
charp brother text // brother變成了text文件的所屬組
注意:
1、所屬組就是創建這的所屬者的預設組
2、linux中創建的文件缺少x(可執行)為了使系統更加安全
mask
0022
0特殊許可權
022 ugo --- -w- -w-
1、文件搜索命令find
執行許可權:find
語法:find[搜索范圍][匹配條件]
功能描述:文件搜索
例子:
find /etc -name init (-iname 不區分大小寫)
find /home -user(-group) hl
在根目錄下查找所有者(所有組)為hl的文件
在目錄/etc中查找文件init
init init init // 通配符
?init (?匹配單個字元)
find / -size +204800
在跟目錄下查找大於100MB的文件 (100MB = 102400KB = 204800)
+n 大於 -n小於 n等於
find /etc -cmin -5
例子2:
find /etc -size + 163840 -a size -204800
在/etc下查找大於80MB小於100MB的文件
-a兩個條件同時滿足
-o兩個條件滿足任意一個即可
在/etc下查找5分鍾內被修改的屬性的文件和目錄
-amin 訪問時間 access
-cmin 文件屬性 change
-mmin 文件內容 modify
2、文件搜索指令 locate
命名名稱:locate
執行許可權:所有用戶
語法:locate 文件名
功能描述:在文件資料庫中查找文件
例子: $ locate inittab
輸出文件所在位置
locate和find的區別:
locate的查找速度很快,因為find是在分區和磁碟上查找,而locate是在資料庫中查找
注意:如果資料庫沒有實時更新,所以locate可能會查不到要查詢的文件。
即:
updatedb (升級文件的資料庫)
loocate -i 文件名 (-i 不區分大小寫)
3、文件搜索命令:which (更精確呦)
執行許可權:所有用戶
功能描述:搜索命令所在目錄及別名信息
例子: which ls
alias(別名)
4、whiereis
執行許可權:所有用戶
語法: whereis[命令名稱]
功能描述:搜索命令所在目錄及幫助文檔路徑
例子: whereis ls
5、grep
執行許可權:所有用戶
語法:grep -iv[指定字串][文件]
功能描述:在文件中搜索字元串匹配的行並輸出
-i 不區分大小寫
-v 排除指定字元串
例子 grep mysql /root/install.log
補充: linux中 # 表示注釋
命名名稱:man
英文原意:manual
執行許可權:所有用戶
語法:man[命令或配置文件]
功能描述:獲取幫助信息
例子: man ls # 查看ls命令的幫助信息
man services 查看配置文件sevices的幫助信息
補充:man 。。。。後
/-g :查詢與g有關的信息
空格進行翻頁
回車進行換行
按n繼續查找
命令名稱:useradd
執行許可權:root
語法:useradd 用戶名
功能描述: 添加新用戶
例子: useradd HF
命令名稱:passwd
執行許可權:所有用戶
語法:passwd 用戶名
功能描述: 設置用戶密碼
例子: passwd HF
命令名稱:who
執行許可權:所有用戶
語法:who
功能描述: 查看登錄用戶信息
例子: who
輸出內容含義:
登錄用戶名 登錄終端(tty本地登錄、pds表述遠程終端) 登錄時間 登錄主機ip地址
命令名稱:w
執行許可權:所有用戶
語法:w
功能描述: 查看登錄用戶詳細信息
例子: w
命令名稱:gzip
英文原意:GNU zip
執行許可權:所有用戶
語法:gzip[文件]
功能描述: 壓縮文件
壓縮後文件格式:.gz
解壓縮:gunzip 壓縮文件
注意:gizp只能壓縮文件,不能壓縮目錄
命令名稱:tar
執行許可權:所有用戶
語法:tar 選項 [-zcf] [壓縮文件名] [目錄]
-c 打包
-v 顯示詳細文件
-f 指定文件名
-z 打包同時壓縮
功能描述: 打包目錄
壓縮後文件格式:.tar.gz
命令名稱:zip
執行許可權:所有用戶
語法:zip 選項[-r][壓縮後文件名][文件或目錄]
-r 壓縮目錄
功能描述: 壓縮文件或目錄
壓縮後文件格式: zip
注意:zip是window和linux系統中通過用的壓縮格式
命令名稱:bzip2
執行許可權:所有用戶
語法:bzip2 選項 [-k] [文件]
-k 產生壓縮文件後保留有源文件
功能描述: 壓縮文件
壓縮後文件格式: .bz2
注意: bzip2的壓縮比例大,適用於壓縮較大的文件
bunzip2解壓縮
對目錄壓縮:tar.bz2
指令名稱:write
指令許可權:所有用戶
語法:write <用戶名>
功能描述:給用戶發消息 ,以ctrl + D保存
例子: write YX
命令名稱:wall
英文原意:write all
執行許可權:所有用戶
語法:wall [message]
功能描述: 發廣播信息
命令名稱:ping
執行許可權:所有用戶
語法:ping 選項IP地址
-c 指定發送次數
功能描述: 測試網路連通性
例子: ping 192.168.1.156
命令名稱:ifcongig
英文原意:interface configure
執行許可權:root
語法:ifconfig 網卡名稱 IP地址
功能描述:查看和設置網卡信息(設立之臨時IP)
例子: ifconfig etho 192.168.1.156
etch0 本地真實網卡
lo 回環網卡 (用來本機通信個測試的)
cncap:。。網路名稱是乙太網
HWaddr: 16進製表示的 48位的 網卡的物理地址
addr:當前計算機IP地址
Bcast:當前網路地址
Mask:子網掩碼
inet6 addr: 表示的是IPv6的地址信息
RX packets:接受數據包的總數量
TX packets:發送數據包的總數量
Base addtess: 網卡當中的物理位置
命令名稱:mail (郵件命令)
執行許可權:所有用戶
語法:mail [用戶名]
功能描述:查看發送電子郵件
發送:ctrl + D
查詢: mail
例子: mail root
[圖片上傳中...(-d00bb9-1591253201012-0)]
命令名稱:last
執行許可權:所有用戶
語法:last
功能描述:列出目前和過去登入系統的用戶信息
命令名稱:traceroute
執行許可權:所有用戶
語法:traceroute
功能描述:顯示數據包到主機的路徑
例子: traceroute www..con
命令名稱:netstat
執行許可權:所有用戶
語法:netstat [選項]
功能描述:顯示網路相關信息
選項:
-t : TCP協議
-u : UDP協議
-l : 監聽
-r : 路由
-n : 顯示IP地址和埠號
例子:
netstat -tlun 查看本機監聽的埠
netstat -an 查看本機所有網路鏈接
netstat -rn 查看本屆路由表
命令名稱:setup
執行許可權:root
語法:setup
功能描述:配置網路(永久生效)
例子: setup
注意:配置網路結束後要重啟網路服務
service network restart
掛在命令
命令名稱:mount
執行許可權:所有用戶
語法:mount[-t 文件系統] 設備文件
例子: mount -t iso9660/dev/sr0/mnt/cdrom
命令名稱:shutdown
[root@localhost~]#shutdown [選項] 時間
選項:- c : 取消前一個關機命令
- h:關機
- r :重啟
特點:可以正確的關閉和保存服務,建議實用
其他關機命令
halt
poweroff (直接斷電)
init 0
重啟命令
reboot
init6
補充:init _ 的數字含義
init0 關機
init1 單用戶(啟動最小最核心的服務)
init2 不完全多用戶,不含NFS服務(network file system 網路文件系統)
init3 完全多用戶
init4 未分配
init5 圖形界面
init6 重啟
查詢系統運行級別
runlevel
退出登錄命令
logout
2. linux驅動是用什麼語法編寫的呢
大部分的硬體驅動都是內核kernel里帶的,kernel由C語言編寫。
3. 請解釋一下這個linux腳本的作用和語法
`代表直接引用命令,$代表對變數的引用。
在「welcome」那一行中,假如getprop ro.build.version.release返回的是2,getprop ro.modversion返回的是3(就是說build version是2,modversion是3),那麼整句的意思就是log -p i -t cm 「Welcome to Android 2/3」
4. linux許多語法無效
未預期的符號`$'do\r''附近有語法錯誤你這里有個\r,windows的換行符,應該是在windows下編輯腳本導致的。dos2unix腳本名,轉換下。
5. linux下的netstat語法:
任意的意思。
*:ssh 表示sshd在每一個IP地址上監聽TCP的22埠!
同樣*:10088是在每一個IP地址上監聽TCP的10088埠!
6. 10 分鍾學會Linux常用 bash命令
顯示所有的環境變數,如果你想獲取某個變數的詳細信息,使用 echo $VARIABLE_NAME .
Example:
whereis使用系統自動構建的資料庫來搜索可執行文件,源文件和手冊頁面。
Example:
它在環境變數PATH指定的目錄中搜索可執行文件。此命令將列印可執行文件的完整路徑。
Example:
清除窗口上的內容。
列出您的文件。 ls 有很多選項: -l 列出「長格式」的文件,其中包含文件的確切大小,擁有該文件的人員,有權查看該文件,以及何時進行上次修改。 -a 列出所有文件,包括隱藏文件。有關此命令的更多信息,請檢查此鏈接。
Example:
創建或更新您的文件。
Example:
它可以在UNIX或Linux下用於以下目的。
顯示文件的第一部分(用空格移動並鍵入q以退出)。
輸出文件的前10行。
輸出最後10行文件。用於-f在文件增長時輸出附加數據。
將文件從一個位置移動到另一個位置。
filename1 文件的源路徑, filename2 是目標路徑。
將文件從一個位置復制到另一個位置。
filename1 文件的源路徑, filename2 是目標路徑。
刪除文件。在目錄上使用此命令會給您顯示一個錯誤: rm: directory: is a directory 。 為了刪除目錄,你必須傳遞 -rf 去遞歸刪除目錄中的所有內容。
比較文件,並列出他們的差異。
讓您更改文件的讀取,寫入和執行許可權。
壓縮文件。
解壓縮gzip壓縮的文件。
讓你查看gzip壓縮文件,而不需要gunzip它。
列印文件。
查看列印機隊列。
Example:
從列印隊列移除某些內容。
awk是處理文本文件最有用的命令。它一行一行地在整個文件上運行。默認情況下,它使用空格分隔欄位。awk命令最常用的語法是
讓我們採取以下文件 /etc/passwd 。以下是此文件包含的示例數據:
所以現在讓我們從這個文件只獲取用戶名。 -F 指定在我們要基於哪個分隔欄位。在我們的例子中 : 。 { print $1 } 意味著列印出第一個匹配欄位。
運行上述命令後,您將獲得以下輸出。
有關如何使用 awk 的更多細節,請查看以下鏈接。
查找文件內的文本。您可以使用grep搜索與一個或多個正則表達式匹配的文本行,並僅輸出匹配的行。
Example:
您還可以通過使用 -i 選項強制grep忽略單詞大小寫。 -r 可用於搜索指定目錄下的所有文件,例如:
-w 只搜索單詞。有關 grep 詳細信息,請查看以下鏈接。
告訴你一個文件中有多少行,多少單詞和多少字元。
Example:
7459 是行數, 15915 是單詞數, 398400 是字元數.
用於過濾和轉換文本的流編輯器。
example.txt
用連字元替換所有空格
使用"d"替換所有的數字
排序文本文件的行
example.txt
sort example.txt
隨機化一個排序的example.txt
報告或省略重復的行
example.txt
只顯示example.txt的唯一行(首先你需要排序,否則看不到重疊)
顯示每行的唯一項,並告訴我找到了多少個實例
從每行文件中刪除部分。
example.txt
顯示第2,7和9欄的空格作為分隔符
顯示一行文字
顯示 "Hello World"
用字母之間的換行顯示 "Hello World"
簡單的最佳文本格式化程序
example: example.txt (1 line)
將example.txt的行輸出為20個字元的寬度
翻譯或刪除字元
example.txt
把所有小寫字母變成為大寫
把所有的空格變成換行符
顯示文件的行數
example.txt
帶行號顯示 example.txt
列印匹配模式的行 - 擴展表達式(別名為:'grep -E')
example.txt
在其中顯示「Lorem」或「dolor」的行
列印匹配模式到的行 - FIXED模式匹配(別名為:'grep -F')
example.txt
在example.txt中找到具體的字元串'(Lorem | doloar)'
生成一個新的目錄。
執行這個,從一個目錄轉移到另外一個目錄。
將你移動到主目錄。此命令接受可選的 dirname ,將你移動到該目錄。
告訴你你目前所在的目錄。
ssh (SSH client) 是一個用來在登錄到遠程機器並執行的命令的程序。
此命令還接受 -p 可用於連接到特定埠的選項。
返回當前登錄用戶名。
允許當前登錄的用戶更改其密碼。
顯示您的磁碟配額。
顯示當前日期和時間。
顯示月份的日歷。
顯示當前的正常運行時間。
顯示誰在線
Displays information about user.
顯示內核信息。
顯示指定命令的手冊。
顯示磁碟使用情況。
顯示文件名中文件和目錄的磁碟使用情況( -s只給出一個總數)。
列出您最後登錄的指定用戶。
列出您的進程。
使用您所提供的ID殺死(結束)進程。
用名稱殺死所有進程。
顯示當前活動的進程。
列出停止的或後台工作的Job; 恢復在後台停止的Job。
前台化最近的Job。
Brings the most recent job in the foreground.
Pings主機並輸出結果。
獲取域的whois信息。
獲取域的DNS信息。
下載文件。
在本地主機和遠程主機之間或兩台遠程主機之間傳輸文件。
從本地主機復制到遠程主機
從遠程主機復制到本地主機
此命令還接受 -P 選項可用於連接到特定的埠。
在bash中你將編寫第一行腳本文件,被叫做 shebang 。任何腳本中的這一行來確定腳本的執行能力,如獨立的可執行文件,而不是在終端中預先鍵入sh,bash,python,php等。
Example:
上面的一行創建一個變數str並給它賦值「hello world」。通過 $ 放在變數名的開頭來檢索變數的值。
Example:
像其他語言一樣,bash也有數組。數組是包含多個值的變數。數組的大小沒有最大限制。bash中的數組為零。第一個元素被索引為元素0.在bash中創建數組有幾種方法。以下給出了哪些。
Examples:
要在特定索引處顯示值,請使用以下語法:
如果沒有提供索引,則假定為數組元素0。要了解數組中有多少值,請使用以下語法:
Bash也支持三元條件。下面是一些例子。
檢查一些關於如何操作字元串的語法
Example:
當您運行上述示例時,該hello函數將輸出「world!」。上述兩個功能 hello 和 say 是相同的。主要區別是功能 say 。此功能列印其接收到的第一個參數。函數內的參數以與給腳本的參數相同的方式進行處理。
bash中的條件語句與其他編程語言相似。條件有許多形式,如最基本的形式是 if 表達式 then 語句,其中語句只有在表達式為真時執行。
有時,如果條件變得混亂,所以你可以使用相同的條件 case statements 。
Expression Examples:
bash 中有三種不同類型的循環。 for , while 和 until .
for 語法:
while 語法:
until 語法:
bash_profile 可以通過運行後面的命令打開。 nano ~/.bash_profile
nano ~/.bashrc
source ~/.bashrc
cd hotellogs
您可以通過傳遞不同的選項來輕松地調試bash腳本bash。例如-n,不會運行命令並僅檢查語法錯誤。-vecho命令在運行它們之前。-x命令行處理後的echo命令。
7. linux tftp命令詳解
tftp命令是linux下的一個命令,那麼它的具體語法是怎樣的呢?下面由我為大家整理了linux tftp命令的相關知識,希望對大家有幫助!
1.linux tftp命令語法
tftp(選項)(參數)
2.linux tftp命令選項
-c:指定與tftp伺服器連接成功後,立即要執行的指令;
-m:指定文件傳輸模式。可以是ASCII或者Binary;
-v:顯示指令詳細執行過程;
-V:顯示指令版本信息。
3.linux tftp命令參數
主機:指定tftp要聯機的tftp伺服器的ip地址或主機名。
4.linux tftp命令實例
1、安裝tftp伺服器
需要安裝xinetd、tftp和tftp-server 3個軟體
如果能上網,通過yum安裝:
yum install xinetd
yum install tftp
yum install tftp-server
如果不能上網,可以直接安裝提供的rpm包:
rpm -ivh xinetd-2.3.14-18.fc9.i386.rpm
rpm -ivh tftp-0.48-3.fc9.i386.rpm
rpm -ivh tftp-server-0.48-3.fc9.i386.rpm
2、配置tftp伺服器
修改/etc/xinetd.d/tftp文件,將其中的disable=yes改為disable=no。主要是設置TFTP伺服器的根目錄,開啟服務。修改後的文件如下:
service tftp {
socket_type =dgram
protocol =udp
wait =yes
user =root
server =/usr/sbin/in.tftpd
server_args =-s /home/mike/tftpboot -c
disable =no
per_source =11
cps =100 2
flags =IPv4
}
說明:修改項server_args= -s -c,其中處可以改為你的tftp-server的根目錄,參數-s指定chroot,-c指定了可以創建文件。
3、啟動tftp伺服器並關閉防火牆
/etc/init.d/iptables stop //關閉防火牆
sudo /sbin/service xinetd start
或
service xinetd restart
/etc/init.d/xinetd start
看到啟動[OK]就可以了
4、查看tftp服務是否開啟
netstat -a | grep tftp
顯示結果為udp 0 0 *:tftp *:*表明服務已經開啟,就表明tftp配置成功了。
5、tftp使用
復制一個文件到tftp伺服器目錄,然後在主機啟動tftp軟體,進行簡單測試。
tftp 192.168.1.2
tftp>get
tftp>put
tftp>q
6、tftp命令用法如下
tftp your-ip-address
進入TFTP操作:
connect:連接到遠程tftp伺服器
mode:文件傳輸模式
put:上傳文件
get:下載文件
quit:退出
verbose:顯示詳細的處理信息
tarce:顯示包路徑
status:顯示當前狀態信息
binary:二進制傳輸模式
ascii:ascii 傳送模式
rexmt:設置包傳輸的超時時間
timeout:設置重傳的超時時間
help:幫助信息
? :幫助信息
7、如果老是出現“AVC Denial, click icon to view”的錯誤,並不能傳輸文件,需要作如下修改
修改/etc/sysconfig/selinux,將SELINUX設定為disable,使用命令setenforce 0讓selinux配置文件生效。
8、Busybox中tftp命令的用法
命令格式為:
tftp [option] ... host [port]
如果要下載或上傳文件的話是一定要用這些option的。
-g 表示下載文件 (get)
-p 表示上傳文件 (put)
-l 表示本地文件名 (local file)
-r 表示遠程主機的文件名 (remote file)
例如,要從遠程主機192.168.1.2上下載 embedexpert,則應輸入以下命令
tftp -g -r embedexpert 192.168.1.2
8. linux中set的用法
linux set 命令
功能說明:設置shell。
語法:set [+-abCdefhHklmnpPtuvx]
補充說明:用set 命令可以設置各種shell選項或者列 出shell變數.單個選項設置常用的特性.在某些選項之後-o參數將特殊特性打開.在某些選項之後使用+o參數將關閉某些特性,不帶任何參數的set命 令將顯示shell的全部變數.除非遇到非法的選項,否則set總是返回ture.
參數:
allexport -a 從設置開始標記所有新的和修改過的用於輸出的變數
braceexpand -B 允許符號擴展,默認選項
emacs 在進行命令編輯的時候,使用內建的emacs編輯器, 默認選項
errexit -e 如果一個命令返回一個非0退出狀態值(失敗),就退出.
histexpand -H 在做臨時替換的時候允許使用!和!! 默認選項
history 允許命令行歷史,默認選項
ignoreeof 禁止coontrol-D的方式退出shell,必須輸入exit。
interactive-comments 在互動式模式下, #用來表示註解
keyword -k 為命令把關鍵字參數放在環境中
monitor -m 允許作業控制
noclobber -C 保護文件在使用重新動向的時候不被覆蓋
noexec -n 在腳本狀態下讀取命令但是不執行,主要為了檢查語法結構。
noglob -d 禁止路徑名擴展,即關閉通配符
notify -b 在後台作業以後通知客戶
nounset -u 在擴展一個沒有的設置的變數的時候, 顯示錯誤的信息
onecmd -t 在讀取並執行一個新的命令後退出
physical -P 如果被設置,則在使用pwd和cd命令時不使用符號連接的路徑 而是物理路徑
posix 改變shell行為以便符合POSIX要求
privileged 一旦被設置,shell不再讀取.profile文件和env文件 shell函數也不繼承任何環境
verbose -v 為調試打開verbose模式
vi 在命令行編輯的時候使用內置的vi編輯器
xtrace -x 打開調試回響模式
設置系統環境變數在本站下面這兩篇文章中有詳細說明:
設置環境變數永久生效 export PS1 :http://www.linuxso.com/a/linuxxitongguanli/1812.html
擴展閱讀:set,env和export這三個命令都可以用來顯示shell變數,其區別?
set 用來顯示本地變數
env 用來顯示環境變數
export 用來顯示和設置環境變數
set 顯示當前shell的變數,包括當前用戶的變數
env 顯示當前用戶的變數
export 顯示當前導出成用戶變數的shell變數
每個shell有自己特有的變數(set)顯示的變數,這個和用戶變數是不同的,當前用戶變數和你用什麼shell無關,不管你用什麼shell都在,比如HOME,SHELL等這些變數,但shell自己的變數不同shell是不同的,比如BASH_ARGC, BASH等,這些變數只有set才會顯示,是bash特有的,export不加參數的時候,顯示哪些變數被導出成了用戶變數,因為一個shell自己的變數可以通過export 「導出」變成一個用戶變數
[root@linux ~]# aaa=bbb
[root@linux ~]# echo $aaa
bbb
[root@linux ~]# set|grep aaa
aaa=bbb
[root@linux ~]# env|grep aaa
[root@linux ~]# export aaa
[root@linux ~]# env|grep aaa
aaa=bbb
(8)linux語法擴展閱讀二:set、env、export——Linux中的環境變數命令
Linux是一個多用戶的操作系統。每個用戶登錄系統後,都會有一個專用的運行環境。通常每個用戶默認的環境都是相同的,這個默認環境實際上就是一組環境 變數的定義。用戶可以對自己的運行環境進行定製,其方法就是修改相應的系統環境變數。
什麼是環境變數
環境變數是一個具有 特定名字的對象,它包含了一個或者多個應用程序所將使用到的信息。許多用戶(特別是那些剛接觸Linux的新手)發現這些變數有些怪異或者難以控制。其 實,這是個誤會:通過使用環境變數,你可以很容易的修改一個牽涉到一個或多個應用程序的配置信息。
常見的環境變數
對於 PATH和HOME等環境變數大家都不陌生。
PATH能夠指定命令的搜索路徑,那麼動態鏈接庫的路徑用什麼變數指定呢?或者就是在 PATH裡面?
比如有一個程序需要/usr/local/lib下面的一個庫文件,應該怎麼指定其路徑呢?
經常看到有些變數如 LD_LIBRARY_PATH,LIBPATH,CLASSPATH等,他們之間有什麼不同和關系?
除此之外,還有下面一些常見環境變 量。
◆ HISTSIZE是指保存歷史命令記錄的條數。
◆ LOGNAME是指當前用戶的登錄名。
◆ HOSTNAME是指主機的名稱,許多應用程序如果要用到主機名的話,通常是從這個環境變數中來取得的。
◆ SHELL是指當前用戶用的是哪種Shell。
◆ LANG/LANGUGE是和語言相關的環境變數,使用多種語言的用戶可以修改此環境變數。
◆ MAIL是指當前用戶的郵件存放目錄。
◆ PS1是基本提示符,對於root用戶是#,對於普通用戶是$。PS2是附屬提示符,默認是「>」。可以通過修改此環境變數來修改當前的命令符,比 如下列命令會將提示符修改成字元串「Hello,My NewPrompt 」。
9. linux shell 怎麼寫
在進行linux測試時編寫腳本是必不可少的,Shell腳本的名稱可以隨便定義,也不要什麼後綴名,例如可以寫abc,smartzip這類名稱,運行時只要鍵入
./smartzip就能運行腳本了。。
每行命令開頭處不用就空格也行。。
第1部分. Linux 腳本編寫基礎
1.1 語法基本介紹
1.1.1 開頭
程序必須以下面的行開始(必須方在文件的第一行):
#!/bin/sh
符號#!用來告訴系統它後面的參數是用來執行該文件的程序。在這個例子中我們使用/bin/sh來執行程序。
當編輯好腳本時,如果要執行該腳本,還必須使其可執行。
要使腳本可執行:
編譯 chmod +x filename 這樣才能用./filename 來運行
1.1.2 注釋
在進行shell編程時,以#開頭的句子表示注釋,直到這一行的結束。我們真誠地建議您在程序中使用注釋。
如果您使用了注釋,那麼即使相當長的時間內沒有使用該腳本,您也能在很短的時間內明白該腳本的作用及工作原理。
1.1.3 變數
在其他編程語言中您必須使用變數。在shell編程中,所有的變數都由字元串組成,並且您不需要對變數進行聲明。要賦值給一個變數,您可以這樣寫:
#!/bin/sh
#對變數賦值:
a="hello world"
# 現在列印變數a的內容:
echo "A is:"
echo $a
有時候變數名很容易與其他文字混淆,比如:
num=2
echo "this is the $numnd"
這並不會列印出"this is the 2nd",而僅僅列印"this is the ",因為shell會去搜索變數numnd的值,但是這個變數時沒有值的。可以使用花括弧來告訴shell我們要列印的是num變數:
num=2
echo "this is the ${num}nd"
這將列印: this is the 2nd
1.1.4 環境變數
由export關鍵字處理過的變數叫做環境變數。我們不對環境變數進行討論,因為通常情況下僅僅在登錄腳本中使用環境變數。
1.1.5 Shell命令和流程式控制制
在shell腳本中可以使用三類命令:
1)Unix 命令:
雖然在shell腳本中可以使用任意的unix命令,但是還是由一些相對更常用的命令。這些命令通常是用來進行文件和文字操作的。
常用命令語法及功能
echo "some text": 將文字內容列印在屏幕上
ls: 文件列表
wc –l file :計算文件行數
wc -w file:計算文件中的單詞數
wc -c file:計算文件中的字元數
cp sourcefile destfile: 文件拷貝
mv oldname newname : 重命名文件或移動文件
rm file: 刪除文件
grep 'pattern' file: 在文件內搜索字元串比如:grep 'searchstring' file.txt
cut -b colnum file: 指定欲顯示的文件內容範圍,並將它們輸出到標准輸出設備比如:輸出每行第5個到第9個字元cut -b5-9 file.txt千萬不要和cat命令混淆,
這是兩個完全不同的命令
cat file.txt: 輸出文件內容到標准輸出設備(屏幕)上
file somefile: 得到文件類型
read var: 提示用戶輸入,並將輸入賦值給變數
sort file.txt: 對file.txt文件中的行進行排序
uniq: 刪除文本文件中出現的行列比如: sort file.txt | uniq
expr: 進行數學運算Example: add 2 and 3expr 2 "+" 3
find: 搜索文件比如:根據文件名搜索find . -name filename -print
tee: 將數據輸出到標准輸出設備(屏幕) 和文件比如:somecommand | tee outfile
basename file: 返回不包含路徑的文件名比如: basename /bin/tux將返回 tux
dirname file: 返迴文件所在路徑比如:dirname /bin/tux將返回 /bin
head file: 列印文本文件開頭幾行
tail file : 列印文本文件末尾幾行
sed: Sed是一個基本的查找替換程序。可以從標准輸入(比如命令管道)讀入文本,並將
結果輸出到標准輸出(屏幕)。該命令採用正則表達式(見參考)進行搜索。不要和shell中的通配符相混淆。比如:將linuxfocus 替換為LinuxFocus :cat text.file | sed 's/linuxfocus/LinuxFocus/' > newtext.fileawk: awk 用來從文本文件中提取欄位。預設地,欄位分割符是空格,可以使用-F指定其他分割符。
cat file.txt | awk -F, '{print $1 "," $3 }'這里我們使用,作為欄位分割符,同時列印第一個和第三個欄位。如果該文件內容如下: Adam Bor, 34, IndiaKerry Miller, 22, USA命令輸出結果為:Adam Bor, IndiaKerry Miller, USA
2) 概念: 管道, 重定向和backtick
這些不是系統命令,但是他們真的很重要。
管道 (|) 將一個命令的輸出作為另外一個命令的輸入。
grep "hello" file.txt | wc -l
在file.txt中搜索包含有」hello」的行並計算其行數。
在這里grep命令的輸出作為wc命令的輸入。當然您可以使用多個命令。
重定向:將命令的結果輸出到文件,而不是標准輸出(屏幕)。
> 寫入文件並覆蓋舊文件
>> 加到文件的尾部,保留舊文件內容。
反短斜線
使用反短斜線可以將一個命令的輸出作為另外一個命令的一個命令行參數。
命令:
find . -mtime -1 -type f -print
用來查找過去24小時(-mtime –2則表示過去48小時)內修改過的文件。如果您想將所有查找到的文件打一個包,則可以使用以下腳本:
#!/bin/sh
# The ticks are backticks (`) not normal quotes ('):
tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`
3)流程式控制制
1.if
"if" 表達式 如果條件為真則執行then後面的部分:
if ....; then
....
elif ....; then
....
else
....
fi
大多數情況下,可以使用測試命令來對條件進行測試。比如可以比較字元串、判斷文件是否存在及是否可讀等等…
通常用" [ ] "來表示條件測試。注意這里的空格很重要。要確保方括弧的空格。
[ -f "somefile" ] :判斷是否是一個文件
[ -x "/bin/ls" ] :判斷/bin/ls是否存在並有可執行許可權
[ -n "$var" ] :判斷$var變數是否有值
[ "$a" = "$b" ] :判斷$a和$b是否相等
執行man test可以查看所有測試表達式可以比較和判斷的類型。
直接執行以下腳本:
#!/bin/sh
if [ "$SHELL" = "/bin/bash" ]; then
echo "your login shell is the bash (bourne again shell)"
else
echo "your login shell is not bash but $SHELL"
fi
變數$SHELL包含了登錄shell的名稱,我們和/bin/bash進行了比較。
快捷操作符
熟悉C語言的朋友可能會很喜歡下面的表達式:
[ -f "/etc/shadow" ] && echo "This computer uses shadow passwors"
這里 && 就是一個快捷操作符,如果左邊的表達式為真則執行右邊的語句。
您也可以認為是邏輯運算中的與操作。上例中表示如果/etc/shadow文件存在則列印」 This computer uses shadow passwors」。同樣或操作(||)在shell編程中也是可用的。這里有個例子:
#!/bin/sh
mailfolder=/var/spool/mail/james
[ -r "$mailfolder" ]' '{ echo "Can not read $mailfolder" ; exit 1; }
echo "$mailfolder has mail from:"
grep "^From " $mailfolder
該腳本首先判斷mailfolder是否可讀。如果可讀則列印該文件中的"From" 一行。如果不可讀則或操作生效,列印錯誤信息後腳本退出。這里有個問題,那就是我們必須有兩個命令:
-列印錯誤信息
-退出程序
我們使用花括弧以匿名函數的形式將兩個命令放到一起作為一個命令使用。一般函數將在下文提及。
不用與和或操作符,我們也可以用if表達式作任何事情,但是使用與或操作符會更便利很多。
2.case
case :表達式可以用來匹配一個給定的字元串,而不是數字。
case ... in
...) do something here ;;
esac
讓我們看一個例子。 file命令可以辨別出一個給定文件的文件類型,比如:
file lf.gz
這將返回:
lf.gz: gzip compressed data, deflated, original filename,
last modified: Mon Aug 27 23:09:18 2001, os: Unix
我們利用這一點寫了一個叫做smartzip的腳本,該腳本可以自動解壓bzip2, gzip 和zip 類型的壓縮文件:
#!/bin/sh
ftype=`file "$1"`
case "$ftype" in
"$1: Zip archive"*)
unzip "$1" ;;
"$1: gzip compressed"*)
gunzip "$1" ;;
"$1: bzip2 compressed"*)
bunzip2 "$1" ;;
*) echo "File $1 can not be uncompressed with smartzip";;
esac
您可能注意到我們在這里使用了一個特殊的變數$1。該變數包含了傳遞給該程序的第一個參數值。
也就是說,當我們運行:
smartzip articles.zip
$1 就是字元串 articles.zip
3. selsect
select 表達式是一種bash的擴展應用,尤其擅長於互動式使用。用戶可以從一組不同的值中進行選擇。
select var in ... ; do
break
done
.... now $var can be used ....
下面是一個例子:
#!/bin/sh
echo "What is your favourite OS?"
select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do
break
done
echo "You have selected $var"
下面是該腳本運行的結果:
What is your favourite OS?
1) Linux
2) Gnu Hurd
3) Free BSD
4) Other
#? 1
You have selected Linux
4.loop
loop表達式:
while ...; do
....
done
while-loop 將運行直到表達式測試為真。will run while the expression that we test for is true.
關鍵字"break" 用來跳出循環。而關鍵字」continue」用來不執行餘下的部分而直接跳到下一個循環。
for-loop表達式查看一個字元串列表 (字元串用空格分隔) 然後將其賦給一個變數:
for var in ....; do
....
done
在下面的例子中,將分別列印ABC到屏幕上:
#!/bin/sh
for var in A B C ; do
echo "var is $var"
done
下面是一個更為有用的腳本showrpm,其功能是列印一些RPM包的統計信息:
#!/bin/sh
# list a content summary of a number of RPM packages
# USAGE: showrpm rpmfile1 rpmfile2 ...
# EXAMPLE: showrpm /cdrom/RedHat/RPMS/*.rpm
for rpmpackage in $*; do
if [ -r "$rpmpackage" ];then
echo "=============== $rpmpackage =============="
rpm -qi -p $rpmpackage
else
echo "ERROR: cannot read file $rpmpackage"
fi
done
這里出現了第二個特殊的變數$*,該變數包含了所有輸入的命令行參數值。
如果您運行showrpm openssh.rpm w3m.rpm webgrep.rpm
此時 $* 包含了 3 個字元串,即openssh.rpm, w3m.rpm and webgrep.rpm.
5. 引號
在向程序傳遞任何參數之前,程序會擴展通配符和變數。這里所謂擴展的意思是程序會把通配符(比如*)替換成合適的文件名,它變數替換成變數值。為了防止程序作這種替換,您可以使用引號:讓我們來看一個例子,假設在當前目錄下有一些文件,兩個jpg文件, mail.jpg 和tux.jpg。
1.2 編譯SHELL腳本
#ch#!/bin/sh mod +x filename
cho *.jpg ∪緩螅梢醞ü淙耄?./filename 來執行您的腳本。
這將列印出"mail.jpg tux.jpg"的結果。
引號 (單引號和雙引號) 將防止這種通配符擴展:
#!/bin/sh
echo "*.jpg"
echo '*.jpg'
這將列印"*.jpg" 兩次。
單引號更嚴格一些。它可以防止任何變數擴展。雙引號可以防止通配符擴展但允許變數擴展。
#!/bin/sh
echo $SHELL
echo "$SHELL"
echo '$SHELL'
運行結果為:
/bin/bash
/bin/bash
$SHELL
最後,還有一種防止這種擴展的方法,那就是使用轉義字元——反斜桿:
echo /*.jpg
echo /$SHELL
這將輸出:
*.jpg
$SHELL
6. Here documents
當要將幾行文字傳遞給一個命令時,here documents(譯者註:目前還沒有見到過對該詞適合的翻譯)一種不錯的方法。對每個腳本寫一段幫助性的文字是很有用的,此時如果我們四有那個 here documents就不必用echo函數一行行輸出。 一個 "Here document" 以
here document 就是一段特殊目的的代碼塊. 他使用I/O 重定向的形式來將一個命令序列傳遞到一個交互程序或者命令中, 比如ftp, cat, 或者ex文本編輯器.
1 COMMAND
limit string 用來劃定命令序列的范圍(譯者注: 兩個相同的limit string之間就是命令序列). 特殊符號
而here document 的形式看上去是如下的樣子:
1 #!/bin/bash
2 interactive-program
選擇一個名字非常詭異的limit string將會避免命令列表和limit string重名的問題.
下面是一個例子,在該例子中,我們對多個文件進行重命名,並且使用here documents列印幫助:
#!/bin/sh
# we have less than 3 arguments. Print the help text:
if [ $# -lt 3 ] ; then
cat
4)函數
如果您寫了一些稍微復雜一些的程序,您就會發現在程序中可能在幾個地方使用了相同的代碼,並且您也會發現,如果我們使用了函數,會方便很多。一個函數是這個樣子的:
functionname()
{
# inside the body $1 is the first argument given to the function
# $2 the second ...
body
}
您需要在每個程序的開始對函數進行聲明。
下面是一個叫做xtitlebar的腳本,使用這個腳本您可以改變終端窗口的名稱。
這里使用了一個叫做help的函數。正如您可以看到的那樣,這個定義的函數被使用了兩次。
#!/bin/sh
# vim: set sw=4 ts=4 et:
help()
{
cat shift by 2
--) shift;break;; # end of options
-*) echo "error: no such option $1. -h for help";exit 1;;
*) break;;
esac
done
echo "opt_f is $opt_f"
echo "opt_l is $opt_l"
echo "first arg is $1"
echo "2nd arg is $2"
您可以這樣運行該腳本:
cmdparser -l hello -f -- -somefile1 somefile2
返回的結果是:
opt_f is 1
opt_l is hello
first arg is -somefile1
2nd arg is somefile2
這個腳本是如何工作的呢?腳本首先在所有輸入命令行參數中進行循環,將輸入參數與case表達式進行比較,如果匹配則設置一個變數並且移除該參數。根據unix系統的慣例,首先輸入的應該是包含減號的參數.
第2部分 實例
現在我們來討論編寫一個腳本的一般步驟。任何優秀的腳本都應該具有幫助和輸入參數。並且寫一個偽腳本(framework.sh),該腳本包含了大多數腳本都需要的框架結構,是一個非常不錯的主意。這時候,在寫一個新的腳本時我們只需要執行一下命令:
cp framework.sh myscript
然後再插入自己的函數。
讓我們再看兩個例子:
(1)二進制到十進制的轉換
腳本 b2d 將二進制數 (比如 1101) 轉換為相應的十進制數。這也是一個用expr命令進行數學運算的例子:
#!/bin/sh
# vim: set sw=4 ts=4 et:
help()
{
cat
第3部分:調試
最簡單的調試命令當然是使用echo命令。您可以使用echo在任何懷疑出錯的地方列印任何變數值。這也是絕大多數的shell程序員要花費80%的時間來調試程序的原因。Shell程序的好處在於不需要重新編譯,插入一個echo命令也不需要多少時間。
shell也有一個真實的調試模式。如果在腳本"strangescript" 中有錯誤,您可以這樣來進行調試:
sh -x strangescript
這將執行該腳本並顯示所有變數的值。
shell還有一個不需要執行腳本只是檢查語法的模式。可以這樣使用:
sh -n your_script
這將返回所有語法錯誤
調試shell程序過程
用戶剛編寫完Shell程序中,不可避免的會有錯誤,這時我們可以利用Bsh中提供的跟蹤選項,該選項會顯示剛剛執行的命令及參數。用戶可以通過set命令打開-x選項或在啟動Shell使用-x選項將Shell設置成跟蹤模式。例如有下面代碼ice_tx:
if [ $# -eq 0 ]
then
echo "usage:sumints integer list"
exit 1
fi
sum=0
until [ $# -eq 0 ]
do
sum='expr $sum + $1'
shift
done
echo $sum
我們用跟蹤模式運行:
$sh -x ice_tx 2 3 4
結果顯示:
+[ 3 -eq 0 ]
+sum=0
+[ 3 -eq 0 ]
+expr 0+2
+sum=2
+shift
+[ 2 -eq 0 ]
+expr 2+3
+sum=5
+shift
+[ 1 -eq 0 ]
+expr 5+4
+sum=9
+[ 0 -eq 0 ]
+echo 9
9
從上面可以看出,跟蹤模式下Shell顯示執行的每一條命令以及該命令使用的變數替換後的參數值。一些控制字如if、then、until等沒顯示。
10. linux 中chmod命令使用的詳細解釋
chmod命令用於改變linux系統文件或目錄的訪問許可權,用它控制文件或目錄的訪問許可權。
該命令有兩種用法:
一、文字設定法:
命令格式:chmod[對象][+|-|=][許可權]文件名
二、數字設定法
命令格式:chmod [許可權] 文件名
(10)linux語法擴展閱讀:
Linux chmod命令語法
chmod [-cfvR] [--help] [--version] mode file...
參數說明
mode : 許可權設定字串,格式如下 :
[ugoa...][[+-=][rwxX]...][,...]
其中:
u 表示該文件的擁有者,g 表示與該文件的擁有者屬於同一個群體(group)者,o 表示其他以外的人,a 表示這三者皆是。
+ 表示增加許可權、- 表示取消許可權、= 表示唯一設定許可權。
r 表示可讀取,w 表示可寫入,x 表示可執行,X 表示只有當該文件是個子目錄或者該文件已經被設定過為可執行。