linux的shell編程
1、連接上相應的linux主機,進入到等待輸入shell指令的linux命令行狀態下。
② LINUX SHELL編程
#include <stdio.h>
#include <signal.h>
#define MAXARGS 20 /* cmdline args */
#define ARGLEN 100 /* token length */
main()
{
char *arglist[MAXARGS+1]; /* an array of ptrs */
int numargs; /* index into array */
char argbuf[ARGLEN]; /* read stuff here */
char *makestring(); /* malloc etc */
numargs = 0;
while ( numargs < MAXARGS )
{
printf("Arg[%d]? ", numargs);
if ( fgets(argbuf, ARGLEN, stdin) && *argbuf != '\n' )
arglist[numargs++] = makestring(argbuf);
else
{
if ( numargs > 0 ){ /* any args? */
arglist[numargs]=NULL; /* close list */
execute( arglist ); /* do it */
numargs = 0; /* and reset */
}
}
}
return 0;
}
execute( char *arglist[] )
/*
* use fork and execvp and wait to do it
*/
{
int pid,exitstatus; /* of child */
pid = fork(); /* make new process */
switch( pid ){
case -1:
perror("fork failed");
exit(1);
case 0:
execvp(arglist[0], arglist); /* do it */
perror("execvp failed");
exit(1);
default:
while( wait(&exitstatus) != pid )
;
printf("child exited with status %d,%d\n",
exitstatus>>8, exitstatus&0377);
}
}
char *makestring( char *buf )
/*
* trim off newline and create storage for the string
*/
{
char *cp, *malloc();
buf[strlen(buf)-1] = '\0'; /* trim newline */
cp = malloc( strlen(buf)+1 ); /* get memory */
if ( cp == NULL ){ /* or die */
fprintf(stderr,"no memory\n");
exit(1);
}
strcpy(cp, buf); /* chars */
return cp; /* return ptr */
}
③ linux shell腳本編程什麼意思
shell腳本編程,你可以想像成自動化處理,只要你將套路都設定好,他就會自動工作。
比如,你設定了
1、早上8點保存並分析昨天保存的系統有沒有出錯;
2、接著監測系統每隔一個時間段的CPU運行率,若連續幾次都是98%~100%,就發信息到你手機上讓你查看。
就這么簡單···
④ Linux如何編寫shell腳本
一般以#!/bin/sh開頭(不是必須要寫,但一定要單獨一行),指定執行這個腳本的shell程序(也可以用#!/bin/zsh或其他),然後就是堆命令了。
Linux的shell腳本支持很多功能,加上Linux高度模塊化的命令,完全可以用shell腳本寫出復雜的程序。
以上只是簡單介紹如何開始寫shell腳本,如果要寫復雜的腳本,還需要深入學習相關知識(如if——fi、case——esac等結構)。
當然,還需要給腳本加上可執行許可權(chmod +x ./file.sh),否則可以用sh ./file.sh方式執行腳本(這里的sh是執行腳本所需shell,命令也可以是zsh ./file.sh或其他)。
整個shell腳本,其實就相當於你在終端輸入的一系列命令,如果想在shell里做什麼,就先想想在終端可以做什麼吧,字元的的連接,就是直接用 "" 雙引號,輸出,變數定義無 $ 符號,但是使用時一定要加上 $ 符號。
"=" 賦值符號,兩邊一定不能有空格,這和其他語言有區別,尤其是你還有自己代碼美觀風格時特別注意,否則會報語法錯誤!
for 中的數組內容是以 " " 空格分隔,而非 "," 逗號分格。
條件判斷 [ true ] 中括弧 後面需要有一個空格,但是兩個中括弧之間不能有空格如 [[ true ]]。
while 條件判斷可以用 () 括弧,也可以用 [[ ]] 中括弧。
如果用windows寫shell,一定要注意換行符格式 而非 , 需要藉助一些編輯器(如notepad++)更改換行符格式!
⑤ Linux shell 編程主要是做什麼的
為了方便進行一些簡單的操作和處理。
當然有瘋子想用他寫整個應用程序也不是不可能,但需要調用很多外部程序。
所以主要還是當作類似 Windows 下面批處理一類的東西。
當然 shell 功能要比批處理功能更多,類似 Windows 下面的腳本吧。
其實 shell 編程寫出來的就叫做「腳本」。
我想樓主應該明白什麼東西了吧。
⑥ linux shell 編程
(1)編寫shell程序fileback:
#!/bin/sh
DIRNAME=`ls /root | grep bak`
if [ -z "$DIRNAME" ] ; then
mkdir /root/bak
cd /root/bak
fi
YY=`date +%y`
MM=`date +%m`
DD=`date +%d`
BACKETC=$YY$MM$DD_etc.tar.gz
tar zcvf $BACKETC /etc
echo "fileback finished!"
(2)編寫任務定時器:
echo "0 0 1 * * /bin/sh /usr/bin/fileback" >; /root/etcbakcron
crontab /root/etcbakcron
或使用crontab -e 命令添加定時任務:
0 1 * * * /bin/sh /usr/bin/fileback
⑦ 如何學好linux中的shell編程
1、首先建立一個內容如下的文件,名字為date,將其存放在目錄下的bin子目錄中。
#Program date
#usageto ::show the date in this way (注釋)
echo 「Mr.$USER,Today is:」
echo date 「+%B%d%A」
echo 「Whish you a lucky day !」
2、編輯完該文件之後它還不能執行,我們需要給它設置可執行許可權。使用如下命令:
chmod +x date
通過以上過程之後,我們就可以像使用ls命令一樣執行這個shell程序.
[beichen@localhost bin]$ date
Mr.beichen,Today is:
January 13 Friday
Whish you a lucky day !
為了在任何目錄里都可以執行這個程序,可以將bin的這個目錄添加到路徑中去。
[beichen@localhost bin]$ PATH=$PATH:$HOME/bin
(註:這里的$HOME代替的是/home/beichen,而bin目錄是自己建的一個目錄)
另外一種執行date的方法就是把它作為一個參數傳給shell命令:
[beichen@localhost /]$ bash date
Mr.beichen,Today is:
January 13 Friday
Whish you a lucky day !
盡管在前面我們使用chmod +x date將date設置為可執行,其實不設置也沒有關系,但在Linux里執行它,需要先告訴系統它是一個可執行的腳本。
[beichen@localhost /]$ .date
Mr.beichen,Today is:
January 13 Friday
Whish you a lucky day !
即在date前面加上一個點」.」,並且用空格與後面的shell腳本的文件名隔開。當然,不推薦這樣做。
二、shell參數
如同ls 命令可以接受目錄等作為它的參數一樣,在shell編程時同樣可以使用參數。Shell有位置參數和內部參數。
1、 位置參數
由系統提供的參數稱為位置參數。位置參數的值可以用$N得到,N是一個數字,如果為1,即$1.類似C語言中的數組,Linux會把輸入的命令字元串分段並給每段進行標號,標號從0開始。第0號為程序名字,從1開始就表示傳遞給程序的參數。如$0表示程序的名字,$1表示傳遞給程序的第一個參數,以此類推。
2、 內部參數
上述過程中的$0是一個內部變數,它是必須的,而$1則可有可無。和$0一樣的內部變數還有以下幾個。
$# ----傳遞給程序的總的參數數目
$? ----上一個代碼或者shell程序在shell中退出的情況,如果正常退出則返回0,反之為非0值。
$* ----傳遞給程序的所有參數組成的字元串。
下面舉例進行說明:
建立一個內容為如下的程序P1:
echo 「Program name is $0」
echo 「There are totally $# parameters passed to this program」
echo 「The last is $?」
echo 「The parameters are $*」
執行後的結果如下:
[beichen@localhost bin]$ P1 this is a test program //傳遞5個參數
Program name is /home/beichen/bin/P1 //給出程序的完整路徑和名字
There are totally 5 parameters passed to this program //參數的總數
The last is 0 //程序執行結果
The parameters are this is a test program //返回有參數組成的字元串
下面我們利用內部變數和位置參數編寫一個名為del的簡單刪除程序:
#name: del
#author: liangnian
#this program to compress a file to the stbin
if test $# -eq 0
then
echo 「Please specify a file!」
else
gzip $1 //先對文件進行壓縮
mv $1.gz $HOME/stbin //移動到回收站
echo 「File $1 is deleted !」
fi
三、變數表達式
在上面我們編寫的小程序中我們用到了一個關鍵字test,其實它是shell程序中的一個表達式?D?D比較(test)。通過和shell提供的if等條件語句(後面我們會介紹)相結合我們可以方便的完判斷。
其用法如下:
test 表達式
表達式所代表的操作符有字元串操作符、數字操作符、邏輯操作符以及文件操作符。其中文件操作符是一種shell獨特的操作符,因為shell里的變數都是字元串,為了達到對文件進行操作的目的,於是才提供了這樣的一種操作符。
1、 字元串比較
作用:測試字元串是否相等、長度是否為零,字元串是否為NULL(註:bash區分零長度字元串和空字元串)
常用的字元穿操作符有:
= 比較兩個字元串是否相同,同則為「是」!= 比較兩個字元串是否相同,不同則為「是」
-n 比較字元串長度是否大於零,如果大於零則為「是」
-z 比較字元串的穿度是否等於零,如果等於則為「是」
2、 數字比較
這里區別於其他編程語言,test語句不使用>?類似的符號來表達大小的比較,而是用整數式來表示這些。
-eq 相等
-ge 大於等於
-le 小於等於
-ne 不等於
-gt 大於
-lt 小於
3、 邏輯操作! 反:與一個邏輯值相反的邏輯值
-a 與(and):兩個邏輯值為「是」返回值才為「是」,反之為「否」
-o 或(or):兩個邏輯值有一個為「是」,返回值就為「是」
4、 文件操作
文件測試表達式通常是為了測試文件的信息,一般由腳本來決定文件是否應該備份、復制或刪除。由於test關於文件的操作符有很多,我們只列舉一些常用的。
-d 對象存在且為目錄返回值為「是」
-f 對象存在且為文件返回值為「是」
-L 對象存在且為符號連接返回值為「是」
-r 對象存在且可讀則返回值為「是」
-s 對象存在且長度非零則返回值為「是」
-w 對象存在且可寫則返回值為「是」
-x 對象存在且可執行則返回值為「是」
file1 ?Cnt(-ot) file2 文件1比文件2新(舊)
四、循環結構語句
shell常見的循環語句有for循環、while循環、until循環
for 循環
語法:for 變數 in 列表
do
操作
done
註:變數是要在循環內部用來指代當前所指代的列表中的那個對象的。
列表是在for 循環的內部要操作的對象,可以是字元串也可以是文件,如果是文件則為文件名。
例:刪除垃圾箱中的所有.gz文件
#delete all file with extension of 「gz」 in the stbin
for I in $HOME/stbin/*.gz
do
rm ?Cf $i
echo 「$i has been deleted!」
done
執行結果如下:
[beichen@localhost bin]$.f_rmgz
/home/beichen/stbin/nessus-4.0.0.2.tar.gz has been deleted!
/home/beichen/stbin/gftp-2.2.1.tar.gz has been deleted!
⑧ Linux裡面基本的shell腳本編寫有哪些
shell腳本就是一些命令的集合。
舉個例子,我想實現這樣的操作:
1)進入到/tmp/目錄;
2)列出當前目錄中所有的文件名;
3)把所有當前的文件拷貝到/root/目錄下;
4)刪除當前目錄下所有的文件。
簡單的4步在shell窗口中需要你敲4次命令,按4次回車。這樣是不是很麻煩?當然這4步操作非常簡單,如果是更加復雜的命令設置需要幾十次操作呢?那樣的話一次一次敲鍵盤會很麻煩。所以不妨把所有的操作都記錄到一個文檔中,然後去調用文檔中的命令,這樣一步操作就可以完成。其實這個文檔呢就是shell腳本了,只是這個shell腳本有它特殊的格式。《linux 就該這么學》
Shell腳本通常都是以.sh 為後綴名的,這個並不是說不帶.sh這個腳本就不能執行,只是大家的一個習慣而已。所以,以後你發現了.sh為後綴的文件那麼它一定會是一個shell腳本了。test.sh中第一行一定是 「#! /bin/bash」 它代表的意思是,該文件使用的是bash語法。如果不設置該行,那麼你的shell腳本就不能被執行。』#』表示注釋,在前面講過的。後面跟一些該腳本的相關注釋內容以及作者和創建日期或者版本等等。當然這些注釋並非必須的,如果你懶的很,可以省略掉,但是筆者不建議省略。因為隨著你工作時間的增加,你寫的shell腳本也會越來越多,如果有一天你回頭查看你寫的某個腳本時,很有可能忘記該腳本是用來干什麼的以及什麼時候寫的。所以寫上注釋是有必要的。另外系統管理員並非你一個,如果是其他管理員查看你的腳本,他看不懂豈不是很郁悶。該腳本再往下面則為要運行的命令了。