shell是Unix/Linux最重要的軟件之一,目前最流行的shell被陳偉Bash,幾乎全部的Linux和絕大部分的Unix均可以使用Bash。
shell是一個命令解釋器,是介於操做系統內核與用戶之間的一個絕緣層。準確地說,他也是一種強力的計算機語言,一個shell程序被稱爲一個腳本,
是一種容易使用的工具,它能夠經過將公共程序,工具,和編譯過的二進制程序粘合在一塊兒來創建應用,事實上,全部的Unix命令和工具再加上公共程序,
對於test與循環結構,也會給腳本添增強力的支持和增長靈活性。shell腳本對於管理系統任務和其它的重複工做的歷程來講,表現的很是好
shell腳本遵循典型的Unix哲學,就是把大的複雜的工程分紅小規模的子任務,而且把這些部件和工具組合起來。shell
何時不使用shell腳本?編程
1、資源密集型的任務,尤爲在須要考慮效率時(排序,hash等) 2、須要處理大任務的數學操做,尤爲是浮點運算,精確運算,或者複雜的算術運算 3、有跨平臺移植需求 4、負責的應用,在必須使用結構化編程的時候 5、對於安全有很高要求的任務,
/etc/shells 查看系統中的shellvim
[root@localhost ~]# cat /etc/shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/nologin /bin/tcsh /bin/csh [root@localhost ~]#
chsh -l改變用戶的shellcentos
[root@localhost ~]# echo $SHELL # 當前的shell /bin/bash [root@localhost ~]#
TAB history !$ alt+ ~/.bash_history ~/.bash_logout在用戶退出的時候調用
alias別名 -- 命令過長複雜的時候能夠用安全
grep --color=ttybash
alias gc='grep --color=tty'當前終端生效 alias 查看別名 [root@localhost ~]# alias alias cp='cp -i' alias egrep='egrep --color=auto' alias fgrep='fgrep --color=auto' alias grep='grep --color=auto' alias l.='ls -d .* --color=auto' alias ll='ls -l --color=auto' alias ls='ls --color=auto' alias mv='mv -i' alias rm='rm -i' alias vi='vim' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' [root@localhost ~]# [root@localhost ~]# which rm alias rm='rm -i' /usr/bin/rm [root@localhost ~]#
針對全部終端生效須要修改文件app
[root@localhost ~]# vim /etc/bashrc
[root@localhost ~]#
shell顯示帶顏色的字體dom
\033[字體背景色;字體顏色m ANSI控制碼 \033[0m 關閉全部屬性工具
字體顏色: 30 - 37字體
[root@localhost ~]# echo -e "\033[31m 紅色字 \033[0m" 紅色字 [root@localhost ~]# echo -e "\033[32m 綠色字 \033[0m" 綠色字 [root@localhost ~]#
字體背景顏色: 40 - 47
[root@localhost ~]# echo -e "\033[42;37m 黑底紅字 \033[0m" 黑底紅字 [root@localhost ~]#
改變提示符文件顏色
[root@localhost ~]# echo -e "\033[40;32m" 原本是黑底白字,如今變爲黑底綠字
報警聲音
[root@localhost ~]# echo -e "\007 the bell ring" the bell ring
xargs命令是給其餘命令傳遞參數的一個過濾器,也是組合多個命令的一個工具,它擅長將標準輸入數據轉換成命令行參數,xargs可以
處理管道或者stdin並將其轉換成特定命令的命令參數。xargs也能夠將單行或多行文本輸入轉換爲其餘格式,例如多行變單行,單行變多行,
xargs的默認命令時echo,空格是默認定界符。這意味着經過管道傳遞給xargs的輸入將會包含換行和空白,不過經過xargs的處理,換行和空白將被空格取代
[root@localhost test]# vim test.txt [root@localhost test]# cat test.txt a b c d e f g h i j k l m n o p q r s t u v w x y z [root@localhost test]# cat test.txt | xargs a b c d e f g h i j k l m n o p q r s t u v w x y z [root@localhost test]#
[root@localhost test]# cat test.txt | xargs -n 3 a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@localhost test]# echo "nameXnameXnameXname" | xargs -dX name name name name [root@localhost test]# echo "nameXnameXnameXname" | xargs -dX -n2 name name name name [root@localhost test]#
建立腳本,腳本文件名以.sh 結尾,爲了可以經過文件名進行分辨
#!/bin/bash
# 告訴系統下面的腳本用什麼解釋器解釋
# 以井號開頭的註釋,介紹腳本的用途
查看磁盤使用狀況 [root@localhost test]# df -h 文件系統 容量 已用 可用 已用% 掛載點 /dev/mapper/centos-root 17G 5.2G 12G 31% / devtmpfs 897M 0 897M 0% /dev tmpfs 912M 0 912M 0% /dev/shm tmpfs 912M 1.1M 911M 1% /run tmpfs 912M 0 912M 0% /sys/fs/cgroup /dev/sda1 1014M 179M 836M 18% /boot tmpfs 183M 4.0K 183M 1% /run/user/42 tmpfs 183M 36K 183M 1% /run/user/1000 tmpfs 183M 0 183M 0% /run/user/0 [root@localhost test]#
腳本從上到下依次解釋,須要chmod +x賦予腳本可執行權限,root用戶x權限,對於普通用戶必須rx(讀一行,執行一行)
腳本中某一條命令出錯了,不影響後邊的執行,shell是解釋性程序,shell從腳本中取出每一行而後用bash解釋,交給內核,有一條出錯後邊的繼續運行。
shell的變量
Linux變量分爲不一樣的種類,人爲的分紅了4種:
1、環境變量,系統啓動的時候指定的一系列變量,這些變量能夠直接拿過來使用,好比查看當前的用戶,當前的shell,當前的家目錄等等
[root@localhost test]# env XDG_SESSION_ID=124 HOSTNAME=localhost.localdomain SELINUX_ROLE_REQUESTED= TERM=xterm SHELL=/bin/bash HISTSIZE=1000 SSH_CLIENT=10.0.0.1 50442 22 SELINUX_USE_CURRENT_RANGE= SSH_TTY=/dev/pts/1 USER=root
echo能夠顯示某一個變量,shell認爲變量全部的值都是字符,不區分字符類型
[root@localhost test]# echo $USER root [root@localhost test]# echo $SHELL /bin/bash [root@localhost test]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin [root@localhost test]# echo $HOME /root [root@localhost test]#
set查看全部變量環境變量與非環境變量,用戶登陸時爲用戶指定的
[root@localhost test]# set
-n 不換行
[root@localhost test]# echo -n$UID -n0 [root@localhost test]# echo -e "aaa\nbbb\n" aaa bbb [root@localhost test]#
[root@localhost test]# echo -e "aaa\tbbb\t" aaa bbb [root@localhost test]#
2、第二種稱爲預約義變量,這也是系統預約義好的,預約義變量和執行程序或者操做名對應的參數相關,好比一個shell腳本也能夠像命令同樣執行, shell也能夠有對一個的一些參數,命令和對應的參數先關,這個也叫做預約義變量
[root@localhost test]# cat z.sh #!/bin/bash echo '$0'=$0 #表示當前的進程名 echo '$*'=$* #表示全部位置參數的內容 echo '$#'=$# #表示位置參數的數量 echo '$$'=$$ #表示當前進程的進程好 echo '$!'=$! #表示後臺運姓的最後一個進程好 echo '$?'=$? #表示命令執行後返回的狀態 [root@localhost test]#
[root@localhost ~]# ./z.sh z y g -bash: ./z.sh: 權限不夠 [root@localhost ~]# chmod 777 z.sh [root@localhost ~]# ./z.sh z y g $0=./z.sh $*=z y g $#=3 $$=18030 $!= $?=0 [root@localhost ~]#
$# 位置參數的數量,判斷超出規定參數的數量,報警。 $? 命令執行後的返回狀態,0位執行正確,非0位執行錯誤,判斷備份tar命令有沒有執行成功 $$ 確認進程是否運行
變量的做用域
當前終端設置a=123,再開啓一個新的終端,新開的bash是不生效的 當前進程的變量不會影響父進程的shell
./z.sh bash z.sh source z.sh .z.sh
前兩個是同樣的,後面的兩種不同,source和.使用當前的shell執行,不會生成子shell
source和.後面的命令若是沒有外部命令就都當作內部命令來處理,若是是尾部命令就會產生子進程,改變子進程的狀態,沒有產生就在內部
子進程到父進程,子進程中定義的變量,父進程得不到,若是須要這樣去作也能夠,可讓子進程產生一個臨時文件,而後父進程訪問這個文件。不過很差,效率低
還能夠經過配置文件,將產生的變量,給其餘的shell使用,Linux給咱們提供了幾個文件
/etc/bashrc /etc//profile ~/.bashrc ~/.bash_profile ~/.bash_logout
/etc/下的會對全部的用戶生效,家目錄下隻影響單一一個用戶。
bashrc打開新的bash就生效
profile必須是用戶登陸,還有就是打開整個圖形界面
[root@localhost ~]# echo $((10+20)) 30 [root@localhost ~]# echo $[10+20] 30 [root@localhost ~]# expr 10+20 10+20 [root@localhost ~]# let a = 10 + 20 -bash: let: =: 語法錯誤: 期待操做數 (錯誤符號是 "=") [root@localhost ~]# let a=10+20 [root@localhost ~]# echo $a 30 [root@localhost ~]#
[root@localhost ~]# date +%m%d 0831 [root@localhost ~]# a=`date+%m%d` bash: date+%m%d: 未找到命令... [root@localhost ~]# a=`date +%m%d` [root@localhost ~]# a=$(date +%m%d) [root@localhost ~]# `echo `echo ls`` ls [root@localhost ~]# $(echo $(echo ls)) anaconda-ks.cfg initial-setup-ks.cfg Python-3.5.3.tgz z.sh Desktop Python-3.5.3 test [root@localhost ~]# a=123 [root@localhost ~]# b=$(echo \$$(echo a)) [root@localhost ~]# echo $b $a [root@localhost ~]# eval echo $b 123 [root@localhost ~]#
………………具體請百度。