⑴ 一個bash shell腳本的第一行是什麼 命令為
#!/bin/bash
一般是這樣的。
⑵ 不過時的技術——Bash腳本
Bash是一種不需要編譯,直接運行在Unix/Linux系統之上的腳本程序。它可以只包含一些簡單的命令,順序執行;也可以包含變數、控制語句等復雜的語法結構。Unix/Linux系統一直就是計算機世界的基石,Bash也是系統管理員、程序員必須掌握的技術之一,很多工作都可以藉助Bash自動執行。甚至Unix/Linux系統本身的很多功能,也是由Bash實現的。隨意打開 /etc/init.d/ 目錄下的某個文件,會發現就是一個Bash腳本,在Linux中,存在這大量這樣的腳本。
上面的腳本看似復雜,但從結構上可以簡單劃分為四部分:
1. 第一行 #! /bin/sh 叫 shebang ,標明這是一個Shell腳本。
2. 後面以 # 打頭的是注釋,說明該腳本的作用及用法。
3. 中間一大段是命令及控制語句,這里是真正做事的地方。
4. 最後 exit 0 ,退出腳本。
一個Linux命令執行後,都會有一個返回值, 0 表示命令執行成功, 1 表示命令執行過程中出錯,根據錯誤的不同,還可能返回 2 、 3 、 4 等值。在Linux中,變數 $? 記錄了上次命令的返回值。使用 echo $? 可以查看上次命令執行成功與否。Bash腳本的返回值默認為最後一條命令的返回值,很多時候這並不是我們想要的結果,因此常常在腳本最後使用 exit 0 顯式聲明返回值。
遵循上面的規則,我們可以編寫出自己的第一個Bash腳本: hello_world ,它的作用是在命令行列印一條消息。
切換到該腳本所在目錄, bash hello_world 運行該腳本,不出意外的話,恭喜你寫出了第一個Bash腳本。
通常人們不採用 bash hello_world 這種方式運行Bash腳本,而是賦給腳本可執行許可權,直接運行腳本:
有些同學會在運行腳本時碰到一個問題:既然已經在當前目錄下,為什麼直接運行 hello_world 會報命令找不到的錯誤?這是因為 當前目錄並不包含在$PATH 路徑下。Linux執行一個程序時,總是在系統環境變數$PATH里找對應的可執行程序,如果找不到,就會報命令找不到的錯誤。我們可以列印出$PATH變數 echo $PATH ,顯然,當前路徑並沒有包含在裡面。
為了方便,系統管理員通常把Bash腳本保存在 /usr/local/bin 和 $USER/bin 目錄下,因為這些目錄默認包含在系統環境變數$PATH里。我喜歡在當前用戶目錄下新建一個 bin 目錄,然後將該目錄加入$PATH,就可以直接在這里編寫Bash腳本了。
編寫Bash腳本時手一滑,可能會將腳本命名為 test ,此時執行腳本會得到意想不到的結果:
使用 which 和 type 命令檢查後發現,事實上執行了一條內置的Linux命令。此時就需要明確指定路徑來執行該腳本了: ./test 。最好是能在命名時注意沖突,隨著對Linux的熟悉,這種情況會慢慢好起來的。
最後為大家布置一道練習題:編寫一個Bash腳本,在當前目錄下生成一個日誌文件,隨意輸入一些內容,備份該文件,並將原始日誌文件內容清空。如果對Linux命令不熟悉,可能要查閱一些資料:如何輸出一些文本到文件、如何清空文件內容等。
讀者若對Bash腳本感興趣,可閱讀 Advanced Bash-Scripting Guide 深入學習,祝大家學習快樂!
⑶ 為什麼shell腳本第一行要#!/bin/sh這個是什麽意思呢
告訴操作系統, 此腳本的解釋器為 /bin/sh 這個可執行文件
類似地, 如果你的腳本用 bash, ksh, 解釋, 第一行就應該是
#!/bin/bash
#!/bin/ksh
之類的
或者, 你自己定義一種腳本語言, 再自己寫個解釋器去執行它, 比如說叫 xshell, 放在 /usr/local/bin 下, 你的腳本第一行就應該是
#!/usr/local/bin/xshell
如果沒有這樣定義的第一行, 不同 unix 類操作系統會用默認 shell 來解釋腳本, 如 unix 往往是 sh, linux 往往是用 bash, ....
⑷ 求寫一個bash腳本
腳本如下。
#!/bin/bash
# default
ip=192.168.168.168
count=3
if [ $# -eq 2 ]; then
[[ $1 =~ ^([0-9]+\.){3}[0-9]+$ ]] && ip=$1
[[ $2 =~ ^[0-9]+$ ]] && count=$2
elif [ $# -eq 1 ]; then
if [[ $1 =~ ^([0-9]+\.){3}[0-9]+$ ]]; then
ip=$1
elif [[ $1 =~ ^[0-9]+$ ]]; then
count=$1
fi
fi
ping -n $count $ip >>$(date +%Y-%m-%d-%H-%M-%S).log
[ $? -ne 0 ] && 這里寫restart pppd的代碼
exit 0
說明:
1)運行腳本時可以帶兩個參數,第一個指示ip,第二個指示ping的次數;若輸入不符合格式要求,使用默認值。
2)若只提供了一個參數,腳本自動根據格式判斷是ip還是ping的次數;另一個使用默認值。
3)若提供的參數個數超過兩個,只取前兩個,格式判斷參見1)。
4)若沒有提供參數,都使用默認值。
5)因為沒用過pppd,所以重啟pppd的代碼由你自行補上。
⑸ 編寫linux shell一個腳本,要求如果第一個位置參數是合法目錄,那麼就把後面給出的各個位置參數所對應的文
在上網瀏覽了惡意網頁後,經常會遇到注冊表被禁用的事情。注冊表被加鎖,其主要原理就是修改注冊表。在注冊表HKEY_CURRENT_USER\Software\Microsoft\Windows\
CurrentVerssion\Policies\System分支下,新建DWORD值「Disableregistrytools」,並設鍵值為「1」。這樣,當有人運行注冊表編輯器時就會出現「注冊編輯已被管理員所禁止」的對話框(如圖1),這樣就可以達到限制別人使用注冊表編輯器的目的。給注冊表解鎖的方法有很多,編輯REG文件導入注冊表是最常用的。本文要介紹的是與眾不同的七招,在此與您分享。
用Word的宏來解鎖
Word也可以給注冊表解鎖?沒錯!我們利用的是微軟在Word中提供的「宏」,沒想到吧?具體方法是:運行Word,然後編寫如下面所示的這個「Unlock」宏,即可給注冊表解鎖:
Sub Unlock()
Dim RegPath As String
RegPath = 「HKEY_CURRENT_USER\Software
\Microsoft\Windows\CurrentVersion\Policies\System」
System.PrivateProfileString(FileName:=「」,Section:=RegPath,Key:=「Disableregistrytools」)=「OK!」
End Sub
其實,這個方法一點都不神秘,只是利用了注冊表的一個特性,即在同一注冊表項下,不能有相同名字的字元串值和DWORD值,如果先前有一個DWORD值存在,則後建立的同名的字元串值會將其覆蓋,這也就間接的刪除了原值。在本例中就是DWORD值Disableregistrytools被同名的字元串值所覆蓋刪除。
修改Regedit.exe文件
修改Regedit.exe文件也可以給注冊表解鎖,前提條件是手頭上要有十六進制文件編輯軟體如UltraEdit或WinHex等。我們以UltraEdit為例,用Ultraedit打開注冊表編輯器Regedit.exe。點擊「搜索」菜單下的「查找」,在彈出的對話框中的「查找ASCII字元」前面打上「√」,在「查找什麼」欄中輸入:Disableregistrytools(如圖2),點擊「確定」開始查找。會找到僅有的一處結果,改成別的字元就可以了。不過長度一定要一樣(20個英文字母),這樣就可以解除對注冊表編輯器的禁用。
使注冊表編輯器無法被禁用
給注冊表編輯器Regedit.exe做個小手術,使之對注冊表禁用功能具有「免疫力」,可以打造一個鎖不住的注冊表編輯器。這對防範惡意網頁對注冊表的禁用非常有好處。用十六進制文件編輯器Ultraedit打開Regedit.exe,查找74 1B 6A 10 A1 00,找到後,把74改為EB即可。現在,你就有了一個鎖不住的注冊表編輯器了。下次既使注冊表被禁用也不用害怕了,只管運行之,保管惡意網頁的修改無效。
用INF文件解鎖
大家一定看到過在Windows中有一種後綴為INF的驅動安裝文件,它實際上是一種腳本語言,通過解釋執行。它包含了設備驅動程序的所有安裝信息,其中也有涉及修改注冊表的相關信息語句,所以我們也可以利用INF文件對注冊表解鎖。
INF文件是由各個小節(Section) 組成。小節的名字從中括弧中起,且在此文件中必須是惟一的。小節的名字是它的入口點。後面是小節內容,形式上是「鍵名稱=鍵值」。在文件中可以添加註釋,由分號完成,分號後的內容不被解釋執行。讓我們開始行動,用記事本編輯如下內容的文件:
[Version]
Signature=「$CHICAGO$」
[DefaultInstall]
DelReg=del
[del]
HKCU,Software\Microsoft\Windows\CurrentVersion\Policies\
System,Disableregistrytools,
1,00,00,00,00
將上面的內容存為del.inf,使用時用右鍵點擊它,在彈出菜單中選擇「安裝」即可給注冊表解鎖(如圖3)。
用JScript解鎖
用記事本編輯如下內容的文件,保存為以.js為後綴名的任意文件,使用時雙擊就可以了。
VAR WSHShell=WSCRIPT.CREA-TOBJEt(「WSCRIPT.SHELL」);
WSHShell.Popup(「為你解鎖注冊表」);
WSHShell.RegWrite(「HKCU\\Software\\Microsoft\\
Windows\\CurrentVersion\\Policies\\
system\\DisableRegistryTools」, 0,「reg_dword」);
大家可以看出用JS對鍵值進行操作時要用兩斜杠「\\」,並且要用「;」表示結束。一般只要能注意這兩點,就沒有問題了。
用VBScript解鎖
用VBScript對注冊表進行解鎖?沒錯!很容易又很簡單的一個方法,用記事本編輯如下內容:
DIM WSH
SET WSH=WSCRIPT.CreateObject(「WSCRIPT.SHELL」)
WSH.POPUP(「為你解鎖注冊表!」)
WSH.Regwrite「HKCU\Software\Microsoft\Windows\
CurrentVersion\Policies\System\DisableRegistryTools」,0,「REG_DWORD」
WSH.POPUP(「注冊表解鎖成功!」)
將以上內容保存為以.vbs為擴展名的任意文件,使用時雙擊即可。
⑹ 使用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
⑺ shell腳本中,怎樣比較第一個參數是否與某字元串匹配
if test 「$1」 = "delete"
then
......
fi
第一個參數用 $1 來取得。
⑻ 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編程從入門到精通》
⑼ linux中shell腳本第一行怎麼寫
第一行一般寫如下語句:
#!/bin/bash
如果計入命令的話就直接一行寫一條命令
如果輸入的命令作為參數的話需要加<<EOF等
這個是我寫的簡單腳本
#!/bin/bash
su - oracle <<EON
export ORACLE_SID=trade
lsnrctl stop
sqlplus /nolog <<EOF
conn / as sysdba
shutdown immediate
exit
EOF
第一行後加 -x是顯示輸出的意思,整體是用root執行啟動資料庫啟動監聽
學習shell可以參考:http://c.biancheng.net/cpp/view/6994.html
希望能幫到您!
⑽ 請問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命令的一個參數,是從文件中讀取腳本執行的意思.