使用 echo $SHELL
來查看當前使用的shelllinux
在linux/unix系統中建立一個進程的方式是首先調用fork()系統調用子進程,而後在子進程中調用系統調用execve()執行一個可執行程序shell
用戶在登錄系統中之後只和shell程序進行交互,經過shell程序發送命令來告知系統作什麼事情bash
可使用zsh的內建命令type來測試一個命令是內建命令仍是外部命令type -a cd
app
使用zsh的內建logout
命令或者內建的exit
命令退出less
使用alias爲某一個命令指定別名alias la='ls -al'
測試
所謂的shell腳本就是一個文本文件,只要在文本文件中輸入咱們想要執行的命令便可(一個命令佔用一行),若是想要命令在一行內使用須要在每一個命令中使用";"來分隔,使用source SHELL文件
來執行shell腳本this
使用chmod +x 文件
爲shell腳本加上可執行權限命令行
使用#!/bin/bash
告訴系統使用指定的shell程序來執行這個腳本文件(必定要寫在腳本文件第一行的開頭處,不然會被當成註釋處理)unix
分號(;)可用來分隔同一行的多條命令,shell會一次執行這些命令,若是使用的是&
而不是分號,意味着shell不用等到該命令完成就能夠繼續執行下一個命令code
變量:shell變量名稱的開頭是一個字母或下劃線,賦值方式爲變量名稱=字符
,當你想取出shell變量的值時,須要在變量名稱前面加上$
字符,當所賦予的值內含空格時,請加上引號
<
改變標準輸入,program < file 可將program 的標準輸入修改成file>
改變標準輸出,program > file可將program的標準輸出修改成file(當文件不存在的時候,會新建一個,存在的話,它就會被覆蓋掉)>>
附加到文件,program >> file可將program的標準輸出附加到file的結尾處(若是目的文件不存在>>重定向符便會新建一個,存在的話TA會將產生的數據附加到文件結尾處)#####特殊文件:/dev/null與/dev/tty
查找一個用戶是否登錄
cat > finduser #!/bin/sh #test //shell會忽略開頭以'#'的行,除了首行 who | grep $1 ^D
使用shell顯示每一個被執行到的命令
能夠在腳本中使用set -x
命令來執行追蹤的功能打開,而後再用set +x
命令關閉它
cat > trace1.sh #!/bin/sh set -x //打開追蹤功能 echo 1st echo set+x //關閉追蹤功能 echo 2nd echo ^D
在屏幕上輸出一個字符串
#!/bin/bash data="fuck" echo "u name is :" echo $data
須要注意的是shell默認賦值是字符串賦值
#!/bin/bash _value=1 _data=$_value+2 echo $_data //此時輸出的結果不是3,而是1+2 使用`$[]`講括號內的表達式做爲數學運算先計算結果後再輸出 #!/bin/bash _value=1 _data=$[$_value+2] echo $_data 此時輸出的結果是3
查看系統中被多少個用戶登錄了 $cat > nusers //創建文件,使用cat複製終端的輸入 who|wc -l // 程序的內容 ^D // ctrl-D表示end-of-file chmod +x nusers //讓文件具備可執行的條件 ./nusers // 執行測試
cat 經常使用的有-n
和-b
選項 -n的做用是給全部輸出的行號前面添加標號
,-b的做用只給非空行添加符號
使用less
命令,則可使用方向鍵來反覆地瀏覽文件內容
建立文件夾使用mkdir
,建立文件以其子文件使用mkdir -p
使用 rm -i
來刪除文件 ,使用 rmdir
來刪除空目錄,使用rm -rf
來刪除非空目錄
1)使用mv -v
來修改文件和目錄的名字,-cv
來顯示mv具體作了什麼事情 2)使用mv
進行文件和目錄的移動
符號鏈接:能夠在多個目錄中保存同一個文件的拷貝,而不佔用新的存儲空間,其最大的優勢是原始文件的內容被更新後,所指向原始文件的連接文件都會被更新
使用ln -s 來建立一個符號連接
,使用rm -rf 符號連接名稱
來刪除符號連接
ln -s display shit // -s爲建立的符號鏈接 , display 但願鏈接的目錄 shit 是最後建立出來的連接文件 cd shit pwd -L //顯示工做目錄的邏輯值 pwd -P //現實工做目錄的實際值
使用cp - v 源文件地址 目的文件夾
來複制文件,使用cp -r
來複制目錄
使用chown root 文件
來修改文件和目錄的全部者
普通用戶執行passwd
來修改登錄密碼
有一種特殊的權限位叫作黏着位,它只對目錄起做用,對一個目錄來講,除了他的全部者之外,其餘用戶也擁有寫權限和執行權限,由於黏着位t只對目錄起做用,而且只能出如今權限位的最後一位
重定向ls
命令輸出到文件data.txt:ls > data.txt
完整的形式應該以下:command 1> outputfile
上面的形式省略了標準輸出的文件描述符數字1,使用ls
發現格式由原來的縱向變成了橫向,由於ls的開發者在源代碼進行了判斷,若是執行ls命令被標準輸出重定向,則以行的格式輸出數據
能夠把一系列的命令的輸出同時重定向到一個文件內,例如{date;df -h,uptime;} > list.txt
以追加的形式像文件中追加數據
#!bin/bash echo echo "wtf" echo "(`date`)">>append.txt //記錄腳本被運行時間 //追加標準輸出到文件append.txt中 echo "the file list of $PWD is :">>append.txt ls -C>>append.txt //以列輸出格式來記錄文件中的文件列表 echo >> append.txt exit 0
當把文件標準輸出重定向到文件,還有另一種方法不會直接覆蓋掉已經存在的文件,就是使用bash自帶的noclobber
set -o noclobber
打開選項noclobber若是文件已經存在的話,bash會輸出錯誤信息
#!/bin/bash echo #關閉選項noclobber set +o noclobber if [ $? -eq 0 ] then echo "Set +o turn off the protection" fi echo #$?最後運行的命令的結束代碼(返回值) #-eq: 適用於或偏向於 "數字相等" echo "create file when set +o noclobber">noclobber.txt if [ $? -eq 0 ] then echo "Set +o turn off the protection" fi echo "create file when set +o noclobber">noclobber.txt set -o noclobber if [ $? -eq 0 ] then echo "Set -o turn on the protection" fi #再次覆蓋掉這個文件,會顯示錯誤 echo "report">noclobber.txt
當一個命令讀取輸入數據時,是從它的標準輸入流讀取的,表明標準輸入流的文件描述符是0,流的名字是stdin
在命令行不帶參數的執行cat
和wc
命令時,他們都會繼續等待輸入來執行相應的操做直到用戶按下ctrl+d
結束
#!/bin/bash linenumber=1 #首先利用bash的內建命令來讀取/etc/passwd文件的第一行 #所以read讀完一行以後就會中止並把讀取到的值賦值給oneline read oneline while ["$oneline"!=""] do echo -e "$linenumber:$oneline\n"; linenumber=`expr $linenumber + 1` #使用外部命令expr對行號linenumber執行加1的算數操做 read oneline done source input.sh < /etc/passwd
標準輸出的文件描述符是1,標準錯誤輸出文件的描述符是2
#!/bin/bash echo "this is a test just make me happy" #可以找到的文件輸入到標準輸出到文件中,而系統找不到的文件會把相應的錯誤信息輸入到文件中 ls /bin/bash /bin/ls adasd/asd >testSuccess.txt 2>successError.txt
經過shell將標準錯誤輸出和標準輸出輸出到相同的地方
#!/bin/bash echo "create two files in current dire" ls bin/bash /bin/ls fuck/aaa &>same.txt ls bin/bash /bin/ls fuck/aaa >same.txt 2>&1 ls bin/bash /bin/ls fuck/aaa >same.txt 2>same.txt 1>&2
上述的三種格式均可以實現這個功能
若是咱們要把一個程序的輸出數據做爲另外一個程序的輸入數據,應該使用管道
#!/bin/bash linenumber=1 #while循環語句增長了管道做爲輸入流 #$1就是指命令行的上一個參數 cat $1|while read oneline do echo -e "$linenumber:$oneline\n" linenumber=`expr $linenumber + 1` done exit 0
把某個文件輸出的同時,並把輸出的結果保存在文件中
#!/bin/bash #排序命令能夠經過sort來實現 #這裏的cat經過-n在每一行前面加了行號 #命令tee複製它的標準輸入到標準輸出及一個指定的文件 sort /etc/passwd|cat -n|tee sort.out
實際上rm 命令不接受任何標準輸入,只接受命令行參數
#!/bin/bash #rm -i $(find . -name '*.out') rm -i `find . -name '*.out'` $(command)或者`command` 這兩種都是用命令command標準輸出替換掉了命令自己