shell腳本經典實例100
㈠ 編寫一個SHELL腳本程序計算1到100的和
#!/銀銷bin/鋒遲游旦春bash
j=0
for ((i=1;i<=100;i++));do
j=$(($i+$j))
done
echo $j
㈡ shell腳本中使用for.do循環語句列出從1到100的數字中能夠被3整除的數求出他們的和並輸出文件命名為sum.sh
#!/bin/bash
sum=0
for i in {1..100}
do
if [ $(( $i % 3 )) -eq 0 ]
then
echo $i
sum=$(( $sum + $i ))
fi
done
echo "sum is: $sum"
保存為sum.sh
㈢ shell腳本
Shell腳本基本知識
概述:shell其實是內核與用戶之間的一個介面,
shell腳本
如果有一系列經常使用的linux命令,你可以把它們存儲在一個文件腫。shenll可以讀取這個文件,並執行其中的命令。這樣的文件成為腳本文件。
執行shell腳本
要創建一個shell腳本,你要使用任何編輯器比如vi在文本文件中編寫他。
為了使用bashshell賴執行腳本magic,其命令是:bashmagic或者./magic
echo命令:
echo「!」
屏幕上就會回顯「!」
#符號
用於在shell腳本腫可以包含註解入口
echo「hello」
#thisisacommentline.thiswouldnotproceanyoutput!
echo「world!」
第二行是一個註解的例子。它將被shell忽略,而且不產生任何消息
變數:
可以在任何時間通過簡單的賦值來創建。
語法:
<variablename>-<value>
Linux中的所有變數都被當作字元串
引用變數:
$符號用於引用一個變數的內容
variable1=${variable2}
讀入值給變數
在執行shell腳本時,shell還允許用戶直接從鍵盤讀入一個值給變數,還可以使用read命令來作。
$readfname
本地和全局shell變數
局部變數
當引用shell時,只有創建它的shell能夠知道變數的存在
全局變數
稱為子shell
shell中創建的變數局部於創建它的shell,除非使用export命令特別指出是全局的。
環境變數:
通過改變這些變數的值,用戶能夠定製此環境
一些環境變數的例子是HOME,PATH,PS1,PS2,LOGNAME,SHLVL,及SHELL
HOME變數
Linux系統中的每個用戶都有一個相關的稱作HOME的目錄
當一個用戶登錄後,進入相應的HOME的目錄
$echo$HOME
PATH變數
包含一列用冒號定界的目錄的路徑名字,便於可執行程序的搜索。
PS1變數
PS1(PromptString1)變數包含了shell提示符,$符號
$PS1=「HELLO>」
HELLO>
PS2變數
是為第二個提示符設置值的環境變數
LOGNAME變數
包含用戶的注冊名字
$echo「${LOGNAME}」
SHLVL變數
該變數包含當前工作的shelllevel
SHELL變數
環境變數存儲了用戶預設的shell
env命令
可用來查看所有的已移出的環境變數表和它們各自的值!
命令替換
在單個命令行中使用多個命令的另外一種方法(非Pipes)是通過命令替換
echo「thedatais`date`」
expr命令
用於求之算術表達式。該命令的輸出被送到標准輸出
$expr4+5
將在屏幕上顯示9
算術展開:
你可以在$((…))中括一個表達式,用下面的命令來計算它的值;
$((expression))
example1
編寫一個shell腳本用於計算呼叫中心未應答的詢問的數量。該腳本應該接受一天那所報告的詢問的總數和應答的詢問的數量,以便計算未應答的詢問的數量。
所有未應答的詢問總數=所有詢問的總數-應答的詢問的數量
<!--[if!supportLists]-->※<!--[endif]-->※※※※※※※※※※※※※※※※※※※※※※※
條件執行
test和[]
求值表達式,並返回true(0)或false()
數值測試:
-eq等於則為真
-ne不等於則為真
-gt大於則為真
-ge大於等於則為真
-lt小於則為真
-le小於等於則為真
if構造
Linuxshell提供了循環和判定的構造,可以在shell腳本中使用
算術測試
結合if構造,它可以用於測試變數的數字值
串測試
test命令也可以用於字元串
=等於則為真
!=不相等則為真
-z字元串長度為零則為真
-n字元串長度不為零則為真
文件測試
test命令也可以用於檢查文件的狀態
-e文件存在則為真
-r文件存在並且可讀則為真
-w文件存在並且可寫則為真
-x文件存在並且可執行則為真
-s文件存在並且至少有一個字元則為真
-d文件存在並且為目錄則為真
-f文件存在並且為普通文件則為真
-c文件存在並且為字元型文件則為真
-b文件存在並且為塊特殊文件則為真
-a並且-o或者!非
exit命令
用於終止shell腳本的執行並返回到$提示符下
case。。。esac
shell腳本中使用的這個構造依據變數的值而執行一組特定指令
當變數的值和其中的一個值匹配的時候,就執行寫在該值下的一組命令。
example3
迭代
while構造
while<條件>
do
<命令(s)>
done
只有條件為真的時候,才能執行do與done之間的命令
until構造
until循環構造的求值模式於while循環相反
until循環將繼續執行直到求值的條件為真的時候
for構造
forvariable_namein<list_of_values>
do
…
done
for循環取一列值作為輸入並對循環中每個值執行循環
break和contineu命令
同其他語言中的用法
example4
控制進程的執行
請求後台處理
用於請求後台進程的符號是(&)
$wctempfile&
[1]2082
$vinewfile
檢查後台進程
ps(進程狀態)命令為每個當前的活動的每個進程產生一行入口。
終止後台進程
可用kill,如下所示
kill278
查看完成一個命令所花的時間
你可以使用time命令來查看一個命令從開始到結束所花的時間
timefine/etc–name「passwd」2>/dev/null/dev/null表明忽略錯誤信息。
管道的介紹
垂直條(|)是管道字元
它只是shell:「|」前面命令的輸出作為「|」之後命令的輸入發送
ls–l|more
用管道組合命令,功能強大
㈣ 請用Shell腳本編寫程序,將100以內能被3或7整除的數的和顯示出來.
#!/bin/bash
sum=0
foriin`seq1100`;do
a=$[$i%3]
b=$[$i%7]
if[$a-eq0]||[$b-eq0];then
sum=$[$sum+$i]
fi
done
echo$sum
㈤ 編寫shell的腳本實現1到100的相加,並輸出如下格式 1+2+3+........+100=
COUNTER=1
SUM=0
printf "啟銀%d" $COUNTER
while [ $COUNTER -le 100 ]do
SUM='expr $COUNTER+$SUM'
printf "+%d" $COUNTER
COUNTER='expr $COUNTER+1'
done
printf "=%d\衡旁坦咐桐n" $SUM
㈥ 編寫Shell腳本文件,在當前目錄下建立100個目錄,並給出執行該文件的步驟
用bash不用寫腳本,一行命令就成
printf 'user%01d\n' {1..100} | xargs mkdir
nc10@your-5554c55be4 ~
$ cd tmp
nc10@your-5554c55be4 ~/tmp
$ ls
nc10@your-5554c55be4 ~/tmp
$ pwd
/home/nc10/tmp
nc10@your-5554c55be4 ~/tmp
$ ls
nc10@your-5554c55be4 ~/tmp
$ printf 'user%01d\n' {1..100} | xargs mkdir
nc10@your-5554c55be4 ~/tmp
$ ls
user1/ user20/ user32/ user44/ user56/ user68/ user8/ user91/
user10/ user21/ user33/ user45/ user57/ user69/ user80/ user92/
user100/ user22/ user34/ user46/ user58/ user7/ user81/ user93/
user11/ user23/ user35/ user47/ user59/ user70/ user82/ user94/
user12/ user24/ user36/ user48/ user6/ user71/ user83/ user95/
user13/ user25/ user37/ user49/ user60/ user72/ user84/ user96/
user14/ user26/ user38/ user5/ user61/ user73/ user85/ user97/
user15/ user27/ user39/ user50/ user62/ user74/ user86/ user98/
user16/ user28/ user4/ user51/ user63/ user75/ user87/ user99/
user17/ user29/ user40/ user52/ user64/ user76/ user88/
user18/ user3/ user41/ user53/ user65/ user77/ user89/
user19/ user30/ user42/ user54/ user66/ user78/ user9/
user2/ user31/ user43/ user55/ user67/ user79/ user90/
nc10@your-5554c55be4 ~/tmp
$
或者用seq
mkdir $(seq -f 'user%01g' 1 100)
nc10@your-5554c55be4 ~/tmp
$ ls
nc10@your-5554c55be4 ~/tmp
$ mkdir $(seq -f 'user%01g' 1 100)
nc10@your-5554c55be4 ~/tmp
$ ls
user1/ user20/ user32/ user44/ user56/ user68/ user8/ user91/
user10/ user21/ user33/ user45/ user57/ user69/ user80/ user92/
user100/ user22/ user34/ user46/ user58/ user7/ user81/ user93/
user11/ user23/ user35/ user47/ user59/ user70/ user82/ user94/
user12/ user24/ user36/ user48/ user6/ user71/ user83/ user95/
user13/ user25/ user37/ user49/ user60/ user72/ user84/ user96/
user14/ user26/ user38/ user5/ user61/ user73/ user85/ user97/
user15/ user27/ user39/ user50/ user62/ user74/ user86/ user98/
user16/ user28/ user4/ user51/ user63/ user75/ user87/ user99/
user17/ user29/ user40/ user52/ user64/ user76/ user88/
user18/ user3/ user41/ user53/ user65/ user77/ user89/
user19/ user30/ user42/ user54/ user66/ user78/ user9/
user2/ user31/ user43/ user55/ user67/ user79/ user90/
nc10@your-5554c55be4 ~/tmp
$
㈦ 學透shell 帶你寫常用的100個 shell 腳本(一)定時刪除過期文件
本文已參與「新人創作禮」活動,一起開啟掘金創作之路。
需要清理伺服器中過期的文件、日誌、臨時壓縮未清理的垃圾文件、過久的備份文件,手動刪除過於繁瑣,可以通過此腳本進行刪除,如有不同場景,適量修改即可
目標:刪除 /home/logs/下超過30天的日誌文件,文件名稱為xxxx-service-2022-06-18-20.out
如果只需單次清理,只需要執行刪除命令即可
添加定時任務,設置每個月1號晚上4點10分執行腳本.當然你也可以根據你自己的需求去整
OK ,此次結束 🔚。
㈧ 編寫shell腳本sum求1-100累加和
sum=0
for((i=1;i<=100;i++));do
sum=$((i+sum))
done
echo$sum
很多很多者老種方法,可首灶升辯畢以網上搜一下貼
㈨ shell程序實現1-2+3-4……-100求和
flag=1;
sum=0;
for((i=1;i<=100;i++));do
add=`expr $flag * $i
sum=`expr $sum + $add`
flag=`expr 0 - $flag`
done
echo $sum
或:
#include<iostream>
using namespace std;
int main()
{
int sum=0;
int i;
for(i=1;i<=100;i++)
sum=sum+i;
cout<<"1+2+3+...+100="<<sum<<endl;
}
(9)shell腳本經典實例100擴展閱讀:
本示例使用Shell函數來完成一個用戶指定的應用程序。將第二個參數值設成1,可讓該模中盯培埋程序以正常大小的窗口完成,並且擁有焦點。 Dim RetValRetVal = Shell("C:WINDOWSCALC.EXE", 1) ' 完成Calculator。
使用shell腳本調用linux中當前時間,並記錄在log文件中,10秒後再次記錄時間。
date>>/tmp/data.log
sleep10
date>>/tmp/data.log
參考旦和資料來源:網路-shell
㈩ 分享70個經典的 Shell 腳本面試題與答案
1) 如何向腳本傳遞參數 ?
./script argument
2) 如何在腳本中使用參數 ?
第一個參數 : $1 ,第二個參數 : $2
cp $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) 舉例如何寫一個函數 ?
12) 如何向連接兩個字元串 ?
輸出
HelloWorld
13) 如何進行兩個整數相加 ?
14) 如何檢查文件系統中是否存在某個文件 ?
15) 寫出 shell 腳本中所有循環語法 ?
for 循環 :
while 循環 :
until 循環 :
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 的輸出是什麼
0
20) 命令 「export」 有什麼用 ?
使變數在子 shell 中可用。
21) 如何在後台運行腳本 ?
nohup command&
大部分時間我們可能是遠程使用Linux,我碰到過由於網路斷線使得在後台運行的 command & 沒了...
22) "chmod 500 script" 做什麼 ?
使腳本所有者擁有可執行許可權。
23) ">" 做什麼 ?
重定向輸出流到文件或另一個流。
24) & 和 && 有什麼區別
25) 什麼時候要在 [ condition ] 之前使用 「if」 ?
當條件滿足時需要運行多條命令的時候。
26) 命令: name=John && echo "My name is $name" 的輸出是什麼
My name is John
27) bash shell 腳本中哪個符號用於注釋 ?
#
28) 命令: echo ${new:-variable} 的輸出是什麼
variable
29) ' 和 " 引號有什麼區別 ?
30) 如何在腳本文件中重定向標准輸出和標准錯誤流到 log.txt 文件 ?
在腳本文件中添加 "exec >log.txt 2>&1" 命令。
31) 如何只用 echo 命令獲取字元串變數的一部分 ?
例子:
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) 寫程序為用戶計算主組數目並顯示次數和組名
36) 如何在 bash shell 中更改標準的域分隔符為 ":" ?
IFS=":"
37) 如何獲取變數長度 ?
${#variable}
38) 如何列印變數的最後 5 個字元 ?
echo ${variable: -5}
39) ${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 命令如何計算字元串中的單詞數目 ?
44) "export $variable" 或 "export variable" 哪個正確 ?
export variable
45) 如何列出第二個字母是 a 或 b 的文件 ?
ls -d ?[ab]*
46) 如何將整數 a 加到 b 並賦值給 c ?
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 ] 有什麼區別
52) = 和 == 有什麼區別
53) 寫出測試 $a 是否大於 12 的命令 ?
[ $a -gt 12 ]
54) 寫出測試 $b 是否小於等於 12 的命令 ?
[ $b -le 12 ]
55) 如何檢查字元串是否以字母 "abc" 開頭 ?
[[ $string == abc* ]]
56) [[ $string == abc* ]] 和 [[ $string == "abc*" ]] 有什麼區別
57) 如何列出以 ab 或 xy 開頭的用戶名 ?
egrep "^ab|^xy" /etc/passwd|cut -d: -f1
58) bash 中 $! 表示什麼意思 ?
後台最近執行命令的 PID.
59) $? 表示什麼意思 ?
前台最近命令的結束狀態。
60) 如何輸出當前 shell 的 PID ?
echo $$
61) 如何獲取傳遞給腳本的參數數目 ?
echo $#
62) $* 和 $@ 有什麼區別
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" ?