Ⅰ 請問shell腳本第一行 -f的含義: #!/usr/bin/awk -f 這個位置還有哪些值,分別表示什麼
Linux下腳本的第一行#! 是指明本腳本使用哪個解釋器來執行當前腳本,從頭文件看出這個一個awk腳本,第一行的意思可以理解為 使用 /usr/bin/awk -f 腳本名 來執行當前腳本:
比如腳本:test.awk的第一行是#!/usr/bin/awk -f那麼執行這個腳本的時候就會根據第一行去尋找解釋器,效果相當於在shell下執行
/usr/bin/awk -f test.akw
這里的-f是awk命令的一個參數,是從文件中讀取腳本執行的意思.
Ⅱ bash腳本問題
....
$1是一個目錄吧 假設/home
$1/*就是 /home/* 就是/home下的所有文件和目錄
Ⅲ bash腳本文件中為什麼以#!開頭
在每個bash腳本的開頭都使用#!,這用來告訴系統此文件的執行需要指定一個
解釋器
。「#!」實際上是一個
2
位元組的魔力數字,這是指定一個文件類型的特殊標記,換句話說,
在這里指是一個可執行的腳本(鍵入
man
magic
來獲得關於這個迷人話題的更多詳細信息)。在「#!」之後接著是一個路徑名,這個路徑名指定了一個解釋腳本中命令的程序,這個程序可以是
shell,其它編程語言或任意一個通用程序。這個指定的程序
從頭開始
解釋並且執行腳本中的命令(從#!行下邊的一行開始),忽略注釋。
如:#!/bin/sh
#!/bin/bash
#!/usr/bin/perl
#!/usr/bin/tcl
#!/bin/sed
-f
#!/usr/awk
-f
上邊每一個腳本頭的行都指定了一個命令解釋器,如果是/bin/sh,那麼就是默認shell(在
Linux
系統中默認是
Bash)。使用#!/bin/sh,在大多數商業發行的
UNIX
上,默認是
Bourneshell,這將讓你的腳本可以正常的運行在非
Linux
機器上,雖然這將會犧牲
Bash
一些獨特的特徵。腳本將與
POSIX
的
sh
標准相一致。
注意:
#!
後邊給出的路徑名必須是正確的,否則將會出現一個錯誤消息,通常是Command
not
found,這將是你運行這個腳本時所得到的唯一結果。當然#!也可以被忽略,不過這樣你的
腳本文件
就只能是一些命令的集合,不能夠使用
shell
內建的指令了。
腳本中的#!行的最重要的任務就是命令解釋器(sh
或者
bash)。因為這行是以#開始的,當命令解釋器執行這個腳本的時候,會把它作為一個注釋行。當然,在這之前,這行語句已經完成了它的任務,就是調用命令解釋器。
註:那些具有
UNIX
味道的腳本(基於
4.2BSD)需要一個
4
位元組的
魔法數字
,在#!後邊需要一個空格#!
/bin/sh。本文來源:《Shell編程從入門到精通》
Ⅳ 求幫寫個簡單的shell腳本文件,在線等
#!/bin/sh
i=0
while true
do
let i+=1
[ $i -eq 10 ] && exit 0
$index=`printf "%03d" $i`
command -i ${index}_input -o ${index}_output
while true
do
grep "abcdefg" ${index}_output >/dev/null 2>&1
[ $? -eq 0 ] && break
sleep 1 # usleep 200000 根據command命令執行快慢選用一個合適的值
done
done
Ⅳ shell腳本第一行寫法
如果不是純單獨用awk sed expect去解釋的話,直接寫你shell的解釋器就行了。
調用awk sed時,直接awk xxxxx sed xxxxx 寫就可以了。
#!/bin/bash
Ⅵ linux shell中,一行開頭的 ! . 是什麼意思
ll程序呢? 簡單的說shell程序就是一個包含若干行
shell或者linux命令的文件.
象編寫高級語言的程序一樣,編寫一個shell程序需要一個文本編輯器.如VI等.
在文本編輯環境下,依據shell的語法規則,輸入一些shell/linux命令行,形成一個完整
的程序文件.
執行shell程序文件有三種方法
(1)#chmod +x file(在/etc/profile中,加入export PATH=$:~/yourpath,就可以在命令行下直接運行,像執行普通命令一樣)
(2)#sh file
(3)# . file
(4)#source file
在編寫shell時,第一行一定要指明系統需要那種shell解釋你的shell程序,如:#! /bin/bash,
#! /bin/csh,/bin/tcsh,還是#! /bin/pdksh .
2.shell中的變數
(1)常用系統變數
$ # :保存程序命令行參數的數目
$ ? :保存前一個命令的返回碼
$ 0 :保存程序名
$ * :以("$1 $2...")的形式保存所有輸入的命令行參數
$ @ :以("$1""$2"...)的形式保存所有輸入的命令行參數
(2)定義變數
shell語言是非類型的解釋型語言,不象用C++/JAVA語言編程時需要事先聲明變數.給一
個變數賦值,實際上就是定義了變數.
在linux支持的所有shell中,都可以用賦值符號(=)為變數賦值.
如:
abc=9 (bash/pdksh不能在等號兩側留下空格 )
set abc = 9 (tcsh/csh)
由於shell程序的變數是無類型的,所以用戶可以使用同一個變數時而存放字元時而存放
整數.
如:
name=abc (bash/pdksh)
set name = abc (tcsh)
在變數賦值之後,只需在變數前面加一個$去引用.
如:
echo $abc
(3)位置變數
當運行一個支持多個命令行參數的shell程序時,這些變數的值將分別存放在位置變數里.
其中第一個參數存放在位置變數1,第二個參數存放在位置變數2,依次類推...,shell保留
這些變數,不允許用戶以令外的方式定義他們.同別的變數,用$符號引用他們.
3.shell中引號的使用方法
shell使用引號(單引號/雙引號)和反斜線("\")用於向shell解釋器屏蔽一些特殊字元.
反引號(")對shell則有特殊意義.
如:
abc="how are you" (bash/pdksh)
set abc = "how are you" (tcsh)
這個命令行把三個單片語成的字元串how are you作為一個整體賦值給變數abc.
abc1='@LOGNAME,how are you!' (bash/pdksh)
set abc1='$LOGNAME,how are you!' (tcsh)
abc2="$LOGNAME,how are you!" (bash/pdksh)
set abc2="$LOGNAME,how are you!" (tcsh)
LOGNAME變數是保存當前用戶名的shell變數,假設他的當前值是:wang.執行完兩條命令後,
abc1的內容是:$LOGNAME, how are you!.而abc2的內容是;wang, how are you!.
象單引號一樣,反斜線也能屏蔽所有特殊字元.但是他一次只能屏蔽一個字元.而不能屏蔽
一組字元.
反引號的功能不同於以上的三種符號.他不具有屏蔽特殊字元的功能.但是可以通過他將
一個命令的運行結果傳遞給另外一個命令.
如:
contents=`ls` (bash/pdksh)
set contents = `ls` (tcsh)
4.shell程序中的test命令
在bash/pdksh中,命令test用於計算一個條件表達式的值.他們經常在條件語句和循環
語句中被用來判斷某些條件是否滿足.
test命令的語法格式:
test expression
或者
[expression]
在test命令中,可以使用很多shell的內部操作符.這些操作符介紹如下:
(1)字元串操作符 用於計算字元串表達式
test命令 | 含義
-----------------------------------------
Str1 = str2 | 當str1與str2相同時,返回True
Str1! = str2| 當str1與str2不同時,返回True
Str | 當str不是空字元時,返回True
-n str | 當str的長度大於0時,返回True
-z str | 當str的長度是0時,返回True
-----------------------------------------
(2)整數操作符具有和字元操作符類似的功能.只是他們的操作是針對整數
test表達式 | 含義
---------------------------------------------
Int1 -eq int2|當int1等於int2時,返回True
Int1 -ge int2|當int1大於/等於int2時,返回True
Int1 -le int2|當int1小於/等於int2時,返回True
Int1 -gt int2|當int1大於int2時,返回True
Int1 -ne int2|當int1不等於int2時,返回True
-----------------------------------------
(3)用於文件操作的操作符,他們能檢查:文件是否存在,文件類型等
test表達式 | 含義
------------------------------------------------
-d file |當file是一個目錄時,返回 True
-f file |當file是一個普通文件時,返回 True
-r file |當file是一個刻讀文件時,返回 True
-s file |當file文件長度大於0時,返回 True
-w file |當file是一個可寫文件時,返回 True
-x file |當file是一個可執行文件時,返回 True
------------------------------------------------
(4)shell的邏輯操作符用於修飾/連接包含整數,字元串,文件操作符的表達式
test表達式 | 含義
----------------------------------------------------------
! expr |當expr的值是False時,返回True
Expr1 -a expr2|當expr1,expr2值同為True時,返回True
Expr1 -o expr2|當expr1,expr2的值至少有一個為True時,返回True
-----------------------------------------------------------
注意:
tcsh shell 不使用test命令,但是tcsh中的表達式同樣能承擔相同的功能.tcsh
支持的表達式於C中的表達式相同.通常使用在if和while命令中.
tcsh表達式 | 含義
-------------------------------------------------------
Int1 <= int2 |當int1小於/等於int2時,返回True
Int1 >= int2 |當int1大於/等於int2時,返回True
Int1 < int2 |當int1小於int2時,返回True
Int1 > int2 |當int1大於int2時,返回True
Str1 == str2 |當str1與str2相同時,返回True
Str1 != str2 |當str1與str2不同時,返回True
-r file |當file是一個可讀文件時,返回True
-w file |當file是一個可寫文件時,返回True
-x file |當file是一個可執行文件時,返回True
-e file |當file存在時,返回True
-o file |當file文件的所有者是當前用戶時,返回True
-z file |當file長度為0時,返回True
-f file |當file是一個普通文件時,返回True
-d file |當file是一個目錄時,返回True
Exp1 || exp2 |當exp1和exp2的值至少一個為True時,返回True
Exp1 && exp2 |當exp1和exp2的值同為True時,返回True
! exp |當exp的值為False時,返回True
不寫語法會錯誤的
Ⅶ 怎麼用shell腳本實現這么一個功能:在一個文件的第一行添加一行字元,新添加的字元成為新的第一行,原第一
#cat file
aaaaa
bbbbb
#sed '1s/.*/abc\n&/' file
abc
aaaaa
bbbbb
Ⅷ shell 腳本中$$,$#,$分別代表什麼意思
給你個全的,你在Linux環境下多試下就明白了:
$0 這個程式的執行名字
$n 這個程式的第n個參數值,n=1..9
$* 這個程式的所有參數,此選項參數可超過9個。
$# 這個程式的參數個數
$$ 這個程式的PID(腳本運行的當前進程ID號)
$! 執行上一個背景指令的PID(後台運行的最後一個進程的進程ID號)
$? 執行上一個指令的返回值 (顯示最後命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤)
$- 顯示shell使用的當前選項,與set命令功能相同
$@ 跟$*類似,但是可以當作數組用
Ⅸ 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
用管道組合命令,功能強大