Linux Shell學習(一)

Linux Shell

使用 echo $SHELL 來查看當前使用的shelllinux

在linux/unix系統中建立一個進程的方式是首先調用fork()系統調用子進程,而後在子進程中調用系統調用execve()執行一個可執行程序shell

用戶在登錄系統中之後只和shell程序進行交互,經過shell程序發送命令來告知系統作什麼事情bash

可使用zsh的內建命令type來測試一個命令是內建命令仍是外部命令type -a cdapp

使用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

  • /dev/null是位桶,傳送到此的文件會被系統丟掉
  • /dev/tty當程序打開此文件時,UNIX會自動重定向到一個終端
訪問shell腳本的參數

查找一個用戶是否登錄

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

在命令行不帶參數的執行catwc命令時,他們都會繼續等待輸入來執行相應的操做直到用戶按下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標準輸出替換掉了命令自己
相關文章
相關標籤/搜索