0. shell 調試
複制代碼 代碼如下:
sh -x somefile.sh
在somefile.sh 檔案裡加上set+x set-x
1. 用 && || 簡化if else
複制代碼 代碼如下:
gzip -t a.tar.gz
if [[ 0 == $? ]]; then
echo "good zip"
else
echo "bad zip"
fi
可以簡化為:
複制代碼 代碼如下:
gzip -t a.tar.gz && echo "good zip" || echo "bad zip"
2. 判斷檔案非空
複制代碼 代碼如下:
if [[ -s $file ]]; then
echo "not empty"
fi
3. 擷取檔案大小
複制代碼 代碼如下:
stat -c %s $file
stat --printf='%s\n' $file
wc -c $file
4. 字元串替換
複制代碼 代碼如下:
${string//pattern/replacement}
a='a,b,c'
echo ${a//,/ /}
5. Contains 子字元串?
string="My string"
if [[ $string == *My* ]]; then
echo "It's there!"
fi
6. rsync備份
複制代碼 代碼如下:
rsync -r -t -v /source_folder /destination_folder
rsync -r -t -v /source_folder [[email protected]:/destination_folder
7. 批量重命名檔案
為所有txt檔案加上.bak 字尾:
複制代碼 代碼如下:
rename '.txt' '.txt.bak' *.txt
去掉所有的bak字尾:
複制代碼 代碼如下:
rename '*.bak' '' *.bak
把所有的空格改成下劃線:
複制代碼 代碼如下:
find path -type f -exec rename 's/ /_/g' {} \;
把檔案名都改成大寫:
複制代碼 代碼如下:
find path -type f -exec rename 'y/a-z/A-Z/' {} \;
8. for/while 循環
複制代碼 代碼如下:
for ((i=0; i < 10; i++)); do echo $i; done
for line in $(cat a.txt); do echo $line; done
for f in *.txt; do echo $f; done
while read line ; do echo $line; done < a.txt
cat a.txt | while read line; do echo $line; done
9. 删除空行
複制代碼 代碼如下:
cat a.txt | sed -e '/^$/d'
(echo "abc"; echo ""; echo "ddd";) | awk '{if (0 != NF) print $0;}'
10. 比較檔案的修改時間
複制代碼 代碼如下:
` file1`.`txt -nt file2`.`txt ` && echo true || echo false
` file1`.`txt -ot file2`.`txt ` && echo true || echo false
11. 實作Dictionary結構
複制代碼 代碼如下:
hput() {
eval "hkey_$1"="$2"
}
hget() {
eval echo '${'"hkey_$1"'}'
}
$ hput k1 aaa
$ hget k1
aaa
12. 去掉第二列
複制代碼 代碼如下:
$echo 'a b c d e f' | cut -d ' ' -f1,3-
$a c d e f
13. 把stderr輸出儲存到變量
複制代碼 代碼如下:
$ a=$( (echo 'out'; echo 'error' 1>&2) 2>&1 1>/dev/null)
$ echo $a
error
14. 删除前3行
複制代碼 代碼如下:
$cat a.txt | sed 1,3d
15. 讀取多個域到變量
複制代碼 代碼如下:
read a b c <<< "xxx yyy zzz"
16. 周遊數組
複制代碼 代碼如下:
array=( one two three )
for i in ${array[@]}
do
echo $i
done
17. 檢視目錄大小
複制代碼 代碼如下:
$ du –sh ~/apps
18. 檢視CPU資訊
複制代碼 代碼如下:
$ cat /proc/cpuinfo
19. date
複制代碼 代碼如下:
$ date +%Y-%m-%d
2012-12-24
$ date +%Y-%m-%d –date ‘-1 day'
2012-12-23
$ date +%Y-m-%d –date ‘Dec 25'
2011-12-25
$ date +%Y-m-%d –date ‘Dec 25 – 10 days'
2011-12-15
20. 擷取路徑名和檔案名
複制代碼 代碼如下:
$ dirname ‘/home/lalor/a.txt'
/home/lalor
$ basename ‘/home/lalor/a.txt'
a.txt
21. 并集和交集
comm 可以用來求并集,交集,差集,假設現在有兩個檔案a和b,它們的内容如下:
複制代碼 代碼如下:
$cat a
1
3
5
$cat b
3
4
5
6
7
$comm a b
1
3
4
5
6
7
$comm -1 -2 a b #交集
3
5
$comm a b | sed 's/\t//g' #并集
1
2
3
4
5
6
7
$comm -1 -3 a b | sed 's/\t//g' #b-a
4
6
7
22. awk複雜分隔符
多字元作分隔符
複制代碼 代碼如下:
$ echo "a||b||c||d" | awk -F '[|][|]' '{print $3}'
c
多種分隔符1
複制代碼 代碼如下:
$echo "a||b,#c d" | awk -F '[| ,#]+' '{print $4}'
d
多種分隔符2
複制代碼 代碼如下:
$echo "a||b##c|#d" | awk -F '([|][|])|([#][#])' '{print $NF}'
c|#d
23. 産生一個随機數
複制代碼 代碼如下:
echo $RANDOM
24. 按照模式split 檔案
複制代碼 代碼如下:
csplit server.log /PATTERN/ -n 2 -s {*} -f server_result -b "%02d.log" -z
/PATTERN/ 用來比對某一行,分割過程由此開始
{*} 根據比對,重複執行分割
-s 靜默模式
-n 分割後檔案名字尾中,數字的個數
-f 分割後的檔案名字首
-b 指定字尾格式
25. 擷取檔案名或者擴充名
複制代碼 代碼如下:
var=hack.fun.book.txt
echo ${var%.*}
hack.fun.book
echo ${var%%.*}
hack
echo ${var#.*}
fun.book.txt
echo ${var##.*}
txt
26. 以 root 帳戶執行上一條指令。
複制代碼 代碼如下:
$sudo !!
其中: * !! 是指上一條指令 * !$ 上一條指令的最後一個參數 * !* 上一條指令的所有參數 * !:3 上一條指令的第3個參數
例如:
複制代碼 代碼如下:
$ls /tmp/somedir
ls: cannot access /tmp/somedir: No such file or directory
$mkdir !$
madir /tmp/somedir
27. 利用 python 搭建一個簡單的 Web 伺服器,可通過 http://$HOSTNAME:8000 通路。
複制代碼 代碼如下:
python -m SimpleHTTPServer
28. 在 Vim 中無需權限儲存編輯的檔案。
複制代碼 代碼如下:
:w !sudo tee %
29. 将上一條指令中的 foo 替換為 bar,并執行。
複制代碼 代碼如下:
^foo^bar
30. 快速備份或複制檔案。
複制代碼 代碼如下:
cp filename{,.bak}
31. 将 ssh keys 複制到 [email protected] 以啟用無密碼 SSH 登入。
複制代碼 代碼如下:
$ssh-copy-id [email protected]
32. 把 linux 桌面錄制為視訊。
複制代碼 代碼如下:
ffmpeg -f x11grab -s wxga -r 25 -i :0.0 -sameq /tmp/out.mpg
33. man 妙用
複制代碼 代碼如下:
man ascii
man test
34. 在 vim 中編輯上一條指令
複制代碼 代碼如下:
fc
35. 删除0 位元組檔案或垃圾檔案
複制代碼 代碼如下:
find . -type f -size 0 -delete
find . -type f -exec rm -rf {} \;
find . -type f -name "a.out" -exec rm -rf {} \;
find . type f -name "a.out" -delete
find . type f -name "*.txt" -print0 | xargs -0 rm -f
36. 在編寫SHELL 時顯示多行資訊
複制代碼 代碼如下:
cat << EOF
+--------------------------------------------------------------+
| === Welcome to Tunoff services === |
+--------------------------------------------------------------+
EOF
注意,在指定結束符時,它必須是該行的唯一内容,并且該行必須以這個字元開頭。
37. 如何給mysql建軟連結
複制代碼 代碼如下:
cd /usr/local/mysql/bin
for i in *
do ln /usr/local/mysql/bin/$i /usr/bin/$i
done
38. 擷取IP位址:
複制代碼 代碼如下:
ifconfig eth0 |grep "inet addr:" |awk '{print $2}'|cut -c 6-
39. 打開檔案數目
複制代碼 代碼如下:
lsof
40. 清除僵屍程序
複制代碼 代碼如下:
ps -eal | awk '{ if ($2 == "Z"){ print $4}}' | kill -9
41. 列印唯一行
複制代碼 代碼如下:
awk '!a[$0]++' file
42. 列印奇數行
複制代碼 代碼如下:
awk 'i=!i' file
awk 'NR%2' file
43. 列印比對行後的某一行
複制代碼 代碼如下:
seq 10 | awk '/4/{f=4};--f==0{print;exit}'
44. 列印某行後後面的10行
複制代碼 代碼如下:
cat file | grep -A100 string
cat file | grep -B100 string #前面
cat file | grep -C100 string #前後
sed -n '/string/,+100p'
awk '/string/{f=100}--f>=0'
45. 擷取指令行最後一個參數
複制代碼 代碼如下:
echo ${!#}
echo ${$#} #錯誤的嘗試
46. 輸出重定向
如果你願你,可以将STDERR 和 STDOUT 的輸出重定向到一個輸出檔案,為此,bash 提供了特殊的重定向符号 &>
複制代碼 代碼如下:
ls file nofile &> /dev/null
我們如何在腳本裡面重定向呢?沒有什麼特别之處,和普通重定向一樣。
複制代碼 代碼如下:
#!/bin/bash
#redirecting output to different locations
echo "now redirecting all output to another location" &>/dev/null
問題就來了,如果我們要将所有的輸出都重定向到某個檔案呢?我們都不希望每次輸出的時候都重定向一下吧,正所謂,山人自有妙計。我們可以用exec 來永久重定向,如下所示:
複制代碼 代碼如下:
#!/bin/bash
#redirecting output to different locations
exec 2>testerror
echo "This is the start of the script"
echo "now redirecting all output to another location"
exec 1>testout
echo "This output should go to testout file"
echo "but this should go the the testerror file" >& 2
輸出結果如下所示:
複制代碼 代碼如下:
This is the start of the script
now redirecting all output to another location
[email protected]:~/temp$ cat testout
This output should go to testout file
[email protected]:~/temp$ cat testerror
but this should go the the testerror file
[email protected]:~/temp$
以追加的方式重定向:
複制代碼 代碼如下:
exec 3 >> testout
取消重定向:
複制代碼 代碼如下:
exec 3> -
47. 函數
任何地方定義的變量都是全局變量,如果要定義局部變量,需加local 關鍵字
shell中的函數也可以用遞歸
複制代碼 代碼如下:
#!/bin/bash
function factorial {
if [[ $1 -eq 1 ]]; then
echo 1
else
local temp=$[ $1 - 1 ]
local result=`factorial $temp`
echo $[ $result * $1 ]
fi
}
result=`factorial 5`
echo $result
建立函數庫
将函數定一個在另一個檔案,然後通過source 指令加載到目前檔案
在指令行使用函數
将函數定義在~/.bashrc 中即可
向函數傳遞數組
複制代碼 代碼如下:
#!/bin/bash
#adding values in an array
function addarray {
local sum=0
local newarray
newarray=(`echo "$@"`)
for value in ${newarray[*]}
do
sum=$[ $sum+$value ]
done
echo $sum
}
myarray=(1 2 3 4 5)
echo "The original array is: ${myarray[*]}"
arg1=`echo ${myarray[*]}`
result=`addarray $arg1`
echo "The result is $result"
48.正規表達式
比對中文字元的正規表達式:[u4e00-u9fa5]
評注:比對中文還真是個頭疼的事,有了這個表達式就好辦了
比對雙位元組字元(包括漢字在内):[^x00-xff]
評注:可以用來計算字元串的長度(一個雙位元組字元長度計2,ASCII字元計1)
比對空白行的正規表達式:^ *$
評注:可以用來删除空白行
比對HTML标記的正規表達式:<(S*?)[^>]*>.*?</1>|<.*? />
評注:網上流傳的版本太糟糕,上面這個也僅僅能比對部分,對于複雜的嵌套标記依舊無能為力
比對首尾空白字元的正規表達式:^s*|s*$
評注:可以用來删除行首行尾的空白字元(包括空格、制表符、換頁符等等),非常有用的表達式
比對Email位址的正規表達式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
評注:表單驗證時很實用
比對網址URL的正規表達式:[a-zA-z]+://[^s]*
評注:網上流傳的版本功能很有限,上面這個基本可以滿足需求
比對帳号是否合法(字母開頭,允許5-16位元組,允許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
評注:表單驗證時很實用
比對國内電話号碼:d{3}-d{8}|d{4}-d{7}
評注:比對形式如0511-4405222或021-87888822
比對騰訊QQ号:[1-9][0-9]{4,}
評注:騰訊QQ号從10000開始
比對中國郵政編碼:[1-9]d{5}(?!d)
評注:中國郵政編碼為6位數字
比對×××:d{15}|d{18}
評注:中國的×××為15位或18位
比對ip位址:d+.d+.d+.d+
評注:提取ip位址時有用
比對特定數字:
^[1-9]d*$ //比對正整數
^-[1-9]d*$ //比對負整數
^-?[1-9]d*$ //比對整數
^[1-9]d*|0$ //比對非負整數(正整數+ 0)
^-[1-9]d*|0$ //比對非正整數(負整數+ 0)
^[1-9]d*.d*|0.d*[1-9]d*$ //比對正浮點數
^-([1-9]d*.d*|0.d*[1-9]d*)$ //比對負浮點數
^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$ //比對浮點數
^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$ //比對非負浮點數(正浮點數+ 0)
^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$ //比對非正浮點數(負浮點數+ 0)
評注:處理大量資料時有用,具體應用時注意修正
比對特定字元串:
^[A-Za-z]+$ //比對由26個英文字母組成的字元串
^[A-Z]+$ //比對由26個英文字母的大寫組成的字元串
^[a-z]+$ //比對由26個英文字母的小寫組成的字元串
^[A-Za-z0-9]+$ //比對由數字和26個英文字母組成的字元串
^w+$ //比對由數字、26個英文字母或者下劃線組成的字元串
Q:1 Shell腳本是什麼、它是必需的嗎?
答:一個Shell腳本是一個文本檔案,包含一個或多個指令。作為系統管理者,我們經常需要使用多個指令來完成一項任務,我們可以添加這些所有指令在一個文本檔案(Shell腳本)來完成這些日常工作任務。
Q:2 什麼是預設登入shell,如何改變指定使用者的登入shell
答:在Linux作業系統,“
/bin/bash
”是預設登入shell,是在建立使用者時配置設定的。使用chsh指令可以改變預設的shell。示例如下所示:
# chsh <使用者名> -s <新shell># chsh linuxtechi -s /bin/sh
Q:3 可以在shell腳本中使用哪些類型的變量?
答:在shell腳本,我們可以使用兩種類型的變量:
- 系統定義變量
- 使用者定義變量
系統變量是由系統系統自己建立的。這些變量通常由大寫字母組成,可以通過“
set
”指令檢視。
使用者變量由系統使用者來生成和定義,變量的值可以通過指令“
echo $<變量名>
”檢視。
Q:4 如何将标準輸出和錯誤輸出同時重定向到同一位置?
答:這裡有兩個方法來實作:
方法一:
2>&1 (如# ls /usr/share/doc > out.txt 2>&1 )
方法二:
&> (如# ls /usr/share/doc &> out.txt )
Q:5 shell腳本中“if”文法如何嵌套?
答:基礎文法如下:
if [ 條件 ]then指令1指令2…..elseif [ 條件 ]then指令1指令2….else指令1指令2…..fifi
Q:6 shell腳本中“
$?
”标記的用途是什麼?
答:在寫一個shell腳本時,如果你想要檢查前一指令是否執行成功,在if條件中使用“
$?
”可以來檢查前一指令的結束狀态。簡單的例子如下:
[email protected]:~# ls /usr/bin/shar/usr/bin/shar
[email protected]:~# echo $?0
如果結束狀态是0,說明前一個指令執行成功。
[email protected]:~# ls /usr/bin/sharels: cannot access /usr/bin/share: No such file or directory
[email protected]:~# echo $?2
如果結束狀态不是0,說明指令執行失敗。
Q:7 在shell腳本中如何比較兩個數字 ?
答:在
if-then
中使用測試指令(
-gt
等)來比較兩個數字,例子如下:
#!/bin/bashx=10y=20if [ $x -gt $y ]thenecho “x is greater than y”elseecho “y is greater than x”fi
Q:8 shell腳本中break指令的作用 ?
答:
break
指令一個簡單的用途是退出執行中的循環。我們可以在while和until循環中使用
break
指令跳出循環。
Q:9 shell腳本中continue指令的作用 ?
答:
continue
指令不同于
break
指令,它隻跳出目前循環的疊代,而不是整個循環。
continue
指令很多時候是很有用的,例如錯誤發生,但我們依然希望繼續執行大循環的時候。
Q:10 告訴我shell腳本中Case語句的文法 ?
答:基礎文法如下:
case 變量 in值1)指令1指令2…..最後指令!! 值2)指令1指令2……最後指令;;esac
Q:11 shell腳本中while循環文法 ?
答:如同for循環,while循環隻要條件成立就重複它的指令塊。不同于for循環,while循環會不斷疊代,直到它的條件不為真。基礎文法:
while [ 條件 ]do指令…done
Q:12 如何使腳本可執行 ?
答:使用
chmod
指令來使腳本可執行。例子如下:
# chmod a+x myscript.sh
Q:13 “
#!/bin/bash
”的作用 ?
答:
#!/bin/bash
是shell腳本的第一行,稱為釋伴(shebang)行。這裡
#
符号叫做hash,而
!
叫做 bang。它的意思是指令通過
/bin/bash
來執行。
Q:14 shell腳本中for循環文法 ?
答:for循環的基礎文法:
for 變量 in 循環清單do指令1指令2….最後指令done
Q:15 如何調試shell腳本 ?
答:使用'
-x
'參數(
sh -x myscript.sh
)可以調試shell腳本。另一個種方法是使用‘
-nv
’參數(
sh -nv myscript.sh
)。
Q:16 shell腳本如何比較字元串?
答:
test
指令可以用來比較字元串。測試指令會通過比較字元串中的每一個字元來比較。
Q:17 Bourne shell(bash) 中有哪些特殊的變量 ?
答:下面的表列出了
Bourne shell
為指令行設定的特殊變量。

Q:18 在shell腳本中,如何測試檔案 ?
答:
test
指令可以用來測試檔案。基礎用法如下表格:
Q:19 在shell腳本中,如何寫入注釋 ?
答:注釋可以用來描述一個腳本可以做什麼和它是如何工作的。每一行注釋以
#
開頭。例子如下:
#!/bin/bash# This is a commandecho “I am logged in as $USER”
Q:20 如何讓 shell 就腳本得到來自終端的輸入?
答:
read
指令可以讀取來自終端(使用鍵盤)的資料。
read
指令得到使用者的輸入并置于你給出的變量中。例子如下:
# vi /tmp/test.sh#!/bin/bashecho ‘Please enter your name’read name
echo “My Name is $name”# ./test.shPlease enter your nameLinuxTechiMy Name is LinuxTechi
Q:21 如何取消變量或取消變量指派 ?
答:“
unset
”指令用于取消變量或取消變量指派。文法如下所示:
# unset <變量名>
Q:22 如何執行算術運算 ?
答:有兩種方法來執行算術運算:
1.使用
expr
指令(# expr 5 + 2)
2.用一個美元符号和方括号(
$[ 表達式 ]
)例如:
test=$[16 + 4] ; test=$[16 + 4]
Q:23 do-while語句的基本格式 ?
答:do-while語句類似于while語句,但檢查條件語句之前先執行指令(LCTT 譯注:意即至少執行一次。)。下面是用do-while語句的文法
do{指令} while (條件)
Q:24 在shell腳本如何定義函數呢 ?
答:函數是擁有名字的代碼塊。當我們定義代碼塊,我們就可以在我們的腳本調用函數名字,該塊就會被執行。示例如下所示:
$ diskusage () { df -h ; }譯注:下面是我給的shell函數文法,原文沒有[ function ] 函數名 [()] {
指令;
[return int;] }
Q:25 如何在shell腳本中使用BC(bash電腦) ?
答:使用下列格式,在shell腳本中使用bc:
variable=`echo “options; expression” | bc`
1) 如何向腳本傳遞參數 ?
./script argument
例子: 顯示檔案名稱腳本
./show.sh file1.txt
cat show.sh
#!/bin/bash
echo $1
(LCTT 譯注:謝謝某匿名訪客的提醒,原題有誤,修改之。)
2) 如何在腳本中使用參數 ?
第一個參數 : $1,第二個參數 : $2
例子 : 腳本會複制檔案(arg1) 到目标位址(arg2)
./copy.sh file1.txt /tmp/cat copy.sh#!/bin/bashcp $1 $2
3) 如何計算傳遞進來的參數 ?
$#
4) 如何在腳本中擷取腳本名稱 ?
$0
5) 如何檢查之前的指令是否運作成功 ?
$?
6) 如何擷取檔案的最後一行 ?
tail-1
7) 如何擷取檔案的第一行 ?
head-1
8) 如何擷取一個檔案每一行的第三個元素 ?
awk'{print $3}'
9) 假如檔案中每行第一個元素是 FIND,如何擷取第二個元素
awk'{ if ($1 == "FIND") print $2}'
10) 如何調試 bash 腳本
将
-xv
參數加到
#!/bin/bash
後
例子:
#!/bin/bash –xv
11) 舉例如何寫一個函數 ?
function example {echo "Hello world!"}
12) 如何向連接配接兩個字元串 ?
V1="Hello"V2="World"V3=${V1}${V2}echo $V3
輸出
HelloWorld
13) 如何進行兩個整數相加 ?
V1=1V2=2let V3=$V1+$V2
echo $V3
輸出
3
據 @kashu 的意見,本題的更佳回答為:
兩個整數相加,還有若幹種方法實作:
A=5B=6echo $(($A+$B)) # 方法 2echo $[$A+$B] # 方法 3expr $A + $B # 方法 4echo $A+$B | bc # 方法 5awk 'BEGIN{print '"$A"'+'"$B"'}' # 方法 6
14) 如何檢查檔案系統中是否存在某個檔案 ?
if [ -f /var/log/messages ]thenecho "File exists"fi
15) 寫出 shell 腳本中所有循環文法 ?
for 循環 :
foriin$(ls);doecho item:$idone
while 循環 :
#!/bin/bashCOUNTER=0while [ $COUNTER -lt 10 ]; doecho The counter is $COUNTER
let COUNTER=COUNTER+1done
until 循環 :
#!/bin/bashCOUNTER=20until [ $COUNTER -lt 10 ]; doecho COUNTER $COUNTER
let COUNTER-=1done
16) 每個腳本開始的
#!/bin/sh
或
#!/bin/bash
表示什麼意思 ?
這一行說明要使用的
shell
。
#!/bin/bash
表示腳本使用
/bin/bash
。對于 python 腳本,就是
#!/usr/bin/python
。
17) 如何擷取文本檔案的第 10 行 ?
head -10 file|tail -1
18) bash 腳本檔案的第一個符号是什麼
#
19) 指令:
[ -z "" ] && echo 0 || echo 1
的輸出是什麼
20) 指令
“export”
有什麼用 ?
使變量在子
shell
中可用。
21) 如何在背景運作腳本 ?
在腳本後面添加
“&”
。
據 @kashu 的意見,更好的答案是:
nohup command&
大部分時間我們可能是遠端使用Linux,我碰到過由于網絡斷線使得在背景運作的
command &
沒了...
22)
"chmod 500 script"
做什麼 ?
使腳本所有者擁有可執行權限。
23)
">"
做什麼 ?
重定向輸出流到檔案或另一個流。
24)
&
和
&&
有什麼差別
-
- 希望腳本在背景運作的時候使用它&
-
- 目前一個腳本成功完成才執行後面的指令/腳本的時候使用它&&
25) 什麼時候要在
[ condition ]
之前使用
“if”
?
當條件滿足時需要運作多條指令的時候。
26) 指令:
name=John && echo 'My name is $name'
的輸出是什麼
variable
27)
bash shell
腳本中哪個符号用于注釋 ?
#
28) 指令:
echo ${new:-variable}
的輸出是什麼
variable
29)
'
和
"
引号有什麼差別 ?
-
- 當我們不希望把變量轉換為值的時候使用它。'
-
- 會計算所有變量的值并用值代替。"
30) 如何在腳本檔案中重定向标準輸出和标準錯誤流到
log.txt
檔案 ?
在腳本檔案中添加
"exec >log.txt 2>&1"
指令。
31) 如何隻用
echo
指令擷取字元串變量的一部分 ?
echo ${variable:x:y}x - 起始位置y - 長度
例子:
variable="My name is Petras, and I am developer."echo ${variable:11:6} # 會顯示 Petras
32) 如果給定字元串
variable="User:123:321:/home/dir"
,如何隻用
echo
指令擷取
home_dir
?
echo ${variable#*:*:*:}
或
echo ${variable##*:}
33) 如何從上面的字元串中擷取
“User”
?
echo ${variable%:*:*:*}
或
echo ${variable%%:*}
34) 如何使用
awk
列出 UID 小于 100 的使用者 ?
awk -F: '$3<100' /etc/passwd
35) 寫程式為使用者計算主組數目并顯示次數群組名
cat /etc/passwd|cut -d: -f4|sort|uniq -c|while read c gdo{ echo $c; grep :$g: /etc/group|cut -d: -f1;}|xargs -n 2done
36) 如何在
bash shell
中更改标準的域分隔符為
":"
?
IFS=":"
37) 如何擷取變量長度 ?
${#variable}
38) 如何列印變量的最後 5 個字元 ?
echo ${variable: -5}
39)
${variable:-10}
和
${variable: -10}
有什麼差別?
-
- 如果之前沒有給 variable 指派則輸出 10;如果有指派則輸出該變量${variable:-10}
-
- 輸出 variable 的最後 10 個字元${variable: -10}
40) 如何隻用
echo
指令替換字元串的一部分 ?
echo ${variable//pattern/replacement}
41) 哪個指令将指令替換為大寫 ?
tr '[:lower:]' '[:upper:]'
42) 如何計算本地使用者數目 ?
wc -l /etc/passwd|cut -d" " -f1 或者 cat /etc/passwd|wc -l
43) 不用 wc 指令如何計算字元串中的單詞數目 ?
set ${string}echo $#
44)
"export $variable"
或
"export variable"
哪個正确 ?
export variable
45) 如何列出第二個字母是 a 或 b 的檔案 ?
ls -d ?[ab]*
46) 如何将整數 a 加到 b 并指派給 c ?
c=$((a+b))
或
c=`expr $a + $b`
或
c=`echo "$a+$b"|bc`
47) 如何去除字元串中的所有空格 ?
echo $string|tr -d " "
48) 重寫這個指令,将輸出變量轉換為複數:
item="car"; echo "I like $item"
?
item="car"; echo "I like ${item}s"
49) 寫出輸出數字 0 到 100 中 3 的倍數(0 3 6 9 …)的指令 ?
for i in {0..100..3}; do echo $i; done
或
for (( i=0; i<=100; i=i+3 )); do echo "Welcome $i times"; done
50) 如何列印傳遞給腳本的所有參數 ?
echo $*
或
echo $@
51)
[ $a == $b ]
和
[ $a -eq $b ]
有什麼差別
-
- 用于字元串比較[ $a == $b ]
-
- 用于數字比較[ $a -eq $b ]
52)
=
和
==
有什麼差別
-
- 用于為變量指派=
-
- 用于字元串比較==
53) 寫出測試
$a
是否大于 12 的指令 ?
[ $a -gt 12 ]
54) 寫出測試
$b
是否小于等于 12 的指令 ?
[ $b -le 12 ]
55) 如何檢查字元串是否以字母
"abc"
開頭 ?
[[ $string == abc* ]]
56)
[[ $string == abc* ]]
和
[[ $string == "abc*" ]]
有什麼差別
-
- 檢查字元串是否以字母 abc 開頭[[ $string == abc* ]]
-
- 檢查字元串是否完全等于 abc[[ $string == "abc" ]]
57) 如何列出以
ab
或
xy
開頭的使用者名 ?
egrep "^ab|^xy" /etc/passwd|cut -d: -f1
58) bash 中
$!
表示什麼意思 ?
背景最近執行指令的 PID.
59)
$?
表示什麼意思 ?
前台最近指令的結束狀态。
60) 如何輸出目前
shell
的
PID
?
echo $$
61) 如何擷取傳遞給腳本的參數數目 ?
echo $#
(LCTT 譯注:和第3題重複了。)
*62)
$*
和
$@
有什麼差別*
-
- 以一個字元串形式輸出所有傳遞到腳本的參數$*
-
- 以 $IFS 為分隔符列出所有傳遞到腳本中的參數$@
63) 如何在
bash
中定義數組 ?
array=("Hi" "my" "name" "is")
64) 如何列印數組的第一個元素 ?
echo ${array[0]}
65) 如何列印數組的所有元素 ?
echo ${array[@]}
66) 如何輸出所有數組索引 ?
echo ${!array[@]}
67) 如何移除數組中索引為 2 的元素 ?
unset array[2]
68) 如何在數組中添加 id 為 333 的元素 ?
array[333]="New_element"
69)
shell
腳本如何擷取輸入的值 ?
a) 通過參數
./script param1 param2
b) 通過
read
指令
read -p "Destination backup Server : " desthost
70) 在腳本中如何使用
"expect"
?
/usr/bin/expect << EOD
spawn rsync -ar ${line} ${desthost}:${destpath}expect "*?assword:*"send "${password}\r"expect eof
EOD
轉載于:https://blog.51cto.com/aftree/1979490