shell-基礎

shell編程特色

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 ~]# 

bash的特性

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命令是給其餘命令傳遞參數的一個過濾器,也是組合多個命令的一個工具,它擅長將標準輸入數據轉換成命令行參數,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]# 

shell腳本規範

建立腳本,腳本文件名以.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 ~]# 

變量置換

………………具體請百度。

相關文章
相關標籤/搜索