shell編程基礎

1、Bash變量

1.1什麼是變量

例如:name,age

1.2變量命名規則

  • 變量名必須以字母數字或下劃線大頭,變量不能以數字開始
  • 變量名稱不能大於255字符
  • 變量名在有效的範圍內必須是唯一的
  • 在Bash中,變量的默認類型都是字符串型

說明

在任何系統中,目錄名,文件名,變量名都要有含義

1.3變量的分類

  • 用戶自定義變量:變量是用戶自定義的
  • 環境變量:這種變量中主要保存的是和系統操作環境相關的數據。變量可以自定義,但是對系統生效的環境變量名和變量作用是固定的
  • 位置參數變量:這種變量主要用來向腳本中傳遞參數或者數據的。變量名不能自定義,變量作用是固定的。
  • 預定義變量:是Bash中一定定義好的變量,變量名不能自定義,變量作用也是固定的。

說明

位置變量其實就是預定義變量

1.4定義變量

規則:

變量名=變量值

例如

x=5
name=“jie cao”

說明:

等號左右兩側不能有空格,否則會報錯
使用雙引號

1.5變量調用

語法

echo $變量名

例如:

echo $x
echo $name 

說明

定義是不用$,調用時使用$

1.6變量疊加

x=123
x="$x"456
x=${x}789

1.7變量查看

set 查看系統中所有變量

選項

-u 如果設定此選項,調用未聲明的變量時會報錯(默認無任何提示)

[root@localhost home]# echo $a

[root@localhost home]# set -u
[root@localhost home]# echo $a
-bash: a: unbound variable
[root@localhost home]# 

說明

例子中無法確認變量$a是否自定義過,如果沒有使用-u選項,則執行$a不會報錯

執行set查看系統所有的環境變量

[root@localhost home]# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.1.2(1)-release'
COLORS=/etc/DIR_COLORS
COLUMNS=189
DIRSTACK=()
EUID=0
GROUPS=()
G_BROKEN_FILENAMES=1
HISTCONTROL=ignoredups
HISTFILE=/root/.bash_history
HISTFILESIZE=10000
HISTSIZE=10000
HOME=/root
HOSTNAME=localhost.localdomain
HOSTTYPE=x86_64
ID=0
IFS=$' \t\n'
LANG=zh_CN.UTF-8
LESSOPEN='||/usr/bin/lesspipe.sh %s'
LINES=40
LOGNAME=root
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:'
MACHTYPE=x86_64-redhat-linux-gnu
MAIL=/var/spool/mail/root
MAILCHECK=60
OLDPWD=/root
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PIPESTATUS=([0]="0")
PPID=1793
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
PS1='[\u@\h \W]\$ '
PS2='> '
PS4='+ '
PWD=/home
SELINUX_LEVEL_REQUESTED=
SELINUX_ROLE_REQUESTED=
SELINUX_USE_CURRENT_RANGE=
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SSH_CLIENT='192.168.50.111 49965 22'
SSH_CONNECTION='192.168.50.111 49965 192.168.50.115 22'
SSH_TTY=/dev/pts/3
TERM=xterm
UID=0
USER=root
_=--color=auto
colors=/etc/DIR_COLORS
[root@localhost home]# x=123
[root@localhost home]# x="$x"456
[root@localhost home]# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.1.2(1)-release'
COLORS=/etc/DIR_COLORS
COLUMNS=189
DIRSTACK=()
EUID=0
GROUPS=()
G_BROKEN_FILENAMES=1
HISTCONTROL=ignoredups
HISTFILE=/root/.bash_history
HISTFILESIZE=10000
HISTSIZE=10000
HOME=/root
HOSTNAME=localhost.localdomain
HOSTTYPE=x86_64
ID=0
IFS=$' \t\n'
LANG=zh_CN.UTF-8
LESSOPEN='||/usr/bin/lesspipe.sh %s'
LINES=40
LOGNAME=root
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:'
MACHTYPE=x86_64-redhat-linux-gnu
MAIL=/var/spool/mail/root
MAILCHECK=60
OLDPWD=/root
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PIPESTATUS=([0]="0")
PPID=1793
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
PS1='[\u@\h \W]\$ '
PS2='> '
PS4='+ '
PWD=/home
SELINUX_LEVEL_REQUESTED=
SELINUX_ROLE_REQUESTED=
SELINUX_USE_CURRENT_RANGE=
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SSH_CLIENT='192.168.50.111 49965 22'
SSH_CONNECTION='192.168.50.111 49965 192.168.50.115 22'
SSH_TTY=/dev/pts/3
TERM=xterm
UID=0
USER=root
_=
colors=/etc/DIR_COLORS
x=123456

1.8變量刪除

unset 變量名

說明:

刪除的變量名前不能添加$

2、環境變量

環境變量與用戶自定義變量的區別?

  • 環境變量是全局變量
  • 用戶自定義變量是局部變量
    • 用戶自定義變量只能在當前shell中生效
    • 環境變量在當前shell和這個shell的所有子shell中生效

在當前bash中輸入bash命令,進入下一級bash

pstree 查看進行樹

[root@localhost home]# bash
[root@localhost home]# pstree
init─┬─auditd───{auditd}
     ├─crond
     ├─dbus-daemon───{dbus-daemon}
     ├─master─┬─pickup
     │        └─qmgr
     ├─6*[mingetty]
     ├─nginx───nginx
     ├─rsyslogd───3*[{rsyslogd}]
     ├─sshd─┬─2*[sshd───bash]
     │      ├─sshd───bash───su───bash
     │      └─sshd───bash───bash───pstree
     └─udevd───2*[udevd]

設置環境變量方法

export z=1
或
變量名=變量值
export 變量名

查看環境變量

set:查看所有環境變量
env:查看環境變量,看不到本地變量

刪除環境變量

unset 變量名

常用系統環境變量

  • HOSTNAME:主機名
  • SHELL:當前的shell
  • TERM:終端環境
  • HISTSIZE:歷史命令條數
  • SSH_CLIENT:當前操作環境是用ssh連接的,這裏記錄客戶端ip
  • SSH_TTY:ssh連接的終端時pts/1
  • USER:當前登錄的用戶

說明:

建議大家把變量命名爲大寫字母表示

PATH環境變量

  • PATH變量:系統查找命令的路徑
  • echo $PATH:查看PATH環境變量
  • PATH=”$PATH”:/root/sh:增加PATH變量的值

PS1環境變量

PS1變量:命令提示符設置

  • \d :顯示日期,格式爲“星期 月 日”
  • \H :顯示完整的主機名。如默認主機名“localhost.localdomain”
  • \t:顯示24小時制時間,格式爲“HH:MM:SS”
  • \A:顯示24小時制時間,格式爲“HH:MM”
  • \u:顯示當前用戶名
  • \w:顯示當前所在目錄的完整名稱
  • \W:顯示當前所在目錄的最後一個目錄
  • $:提示符。如果是root用戶會顯示提示爲“#”,如果是普通用戶會顯示提示符爲“$”

語系變量

命令:locale

說明:

查詢當前系統語系
- LANG:定義系統主語系的變量
- LC_ALL:定義整體語系的變量

[root@localhost home]# locale
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=

補充:

  • echo $LANG :查看系統當前語系,系統當前環境中生效的語系環境
  • locale -a | more :查看linux支持的所有語系
  • cat /etc/sysconfig/i18n:查看系統默認語系,下次開機之後系統默認的語系環境

Linux中文支持

前提條件,正確安裝的中文字體和中文語系

  • 如果有圖形界面,可以正確支持中文顯示
  • 如果使用第三方遠程工具(例如xshell),只要語系設定正確,可以支持中文顯示
  • 如果使用純字符界面,必須使用第三方插件(例如zhcon等支持)

位置參數變量

位置參數變量 作用
$n n爲數字,$0代表命令本身,$1-$9代表第一到第九個參數,十以上的參數需要用大括號包含,如${10}
$* 這個變量代表命令行中所有的參數,$*把所有的參數看成一個整體
$@ 這個變量也代表命令行中所有的參數,不過$@把每個參數區分對待
$# 這個變量代表命令行中所有參數的個數

例子1

位置變量的測試,從命令行中獲取參數的值賦予num1和num2,並加和打印出結果

#!/bin/bash

#從命令行中獲得第一個參數賦值給num1  獲得第二個參數賦值給num2
num1=$1
num2=$2

#變量sum的和是num1加num2
sum=$(($num1 + $num2))

#打印變量sum的值
echo $sum

執行結果

[root@localhost sh]# chmod 755 canshu1.sh 
[root@localhost sh]# ./canshu1.sh 11 22
33

說明:

命令./canshu1.sh 賦值給 $0
11 賦值給 $1
22 賦值給 $2

例子2

#!/bin/bash


#$* 測試示例
echo "\$* can shu shi : $*"

#$@ 測試示例
echo "\$@ can shu shi : $@"

#$# 測試示例
echo "\$# can shu ge shu shi : $#"
~                                                                                                                                                                                            
~                        

執行結果

[root@localhost sh]# chmod 755 canshu2.sh 
[root@localhost sh]# ./canshu2.sh 11 22 33 44
$* can shu shi : 11 22 33 44
$@ can shu shi : 11 22 33 44
$# can shu ge shu shi : 4

例子3:$* 與 $@的區別

#!/bin/bash

#$*中的所有參數看成一個整體,所以這個for循環只會循環一次
for i in "$*"
        do
                echo "The parameters is : $i"
        done

#$@中的每個參數都看成是獨立的,所以"$@"中有幾個參數,就循環幾次,返回所有參數的名稱
#要用雙引號
for y in "$@"
        do
                echo "Parameter:$y"     
        done

執行結果

[root@localhost sh]# ./canshu3.sh aa bb cc dd 
The parameters is : aa bb cc dd
Parameter:aa
Parameter:bb
Parameter:cc
Parameter:dd
發佈了81 篇原創文章 · 獲贊 19 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章