1. 程式人生 > 實用技巧 >linux--shell--變數

linux--shell--變數

1. 變數

bash中變數的值都是字串

分類:

本地變數:當前shell有效

環境變數:在所有由登入程序產生的子程序有效

位置引數:只讀,用於向shell指令碼傳遞引數

2.變數使用

2.1變數替換、賦值

變數替換即引用變數的值

va1=123
va2=${va1}

值有空格則需要用雙引號括起來。變數名和等號直接不能有空格、引用變數時大括號裡不能有空格

變數賦值模式:

variable=value value賦值給變數variable

variable+value 對已賦值的變數,重設其值

variable?value、variable:?value 對未賦值的變數顯示系統錯誤資訊

variable:=value 對未賦值的變數,將value賦值給它

variable:-value 對未賦值的變數,將value賦值給它,但value不儲存到變數對應的地址空間

#!/bin/bash
a="123"
unset a
echo ${a:-"456"}   #輸出 456
echo ${a}              #輸出空行

unset a
echo ${a:="789"}   #輸出 789
echo ${a}              #輸出 789

2.2 清除變數

unset 變數名

2.3只讀變數

設定為只讀後,不能再更改其值

va1="3.14"
readonly va1

3.環境變數

3.1檢視程序環境變數

cat /proc/pid/environ | tr '\0' '\n'

env   #檢視當前程序環境變數

3.2定義一個環境變數

MYPATH=XXX       #先賦值
export MYPATH    #宣告為環境變數

3.3重要環境變數

相關檔案: .bash_profile 、.bashrc、.bash_logout

(1)PWD、OLDPWD

(2)PATH

增加新路徑:/home/usr/bin

export PATH="${PATH}:/home/usr/bin
"

PATH="${PATH}:/home/usr/bin"
export PATH

(3)HOME

(4)SHELL、BASH

預設shell

(5)USER、UID

使用者名稱、UID

(6)PPID

當前程序的父程序程序號

(7)PS1、PS2

提示符變數,用於設定提示符格式

(8)IFS

shell域分隔符,預設空格

(9)BASH_SUBSHELL

(10)BASH_VERSINFO

含6個元素,儲存了bash的版本資訊

#!/bin/bash
for i in {0..5}
do
  echo "BASH_VERSINFO[${i}]=${BASH_VERSINFO[${i}]}"
done

BASH_VERSION :儲存了BASH_VERSINFO的0到4的值

(11)DIRSTACK

目錄棧棧頂

(12)GROUPS

當前使用者所屬群組

(13)

HOSTNAME:主機名

HOSTTYPE、MACHTYPE:硬體架構,同BASH_VERSINFO[5]

(14)REPLY

read讀取的標準輸入儲存到表裡時,若沒有帶變數名,則讀到的標準輸入儲存到REPLY變數

對select命令(select迴圈),序號儲存到REPLY變數

(15 )SECONDS

記錄指令碼從開始執行到結束消耗的時間,單位秒

(16) SHELLOPTS

(17)SHLVL

shell巢狀的層次

(18)TMOUT

設定shell的過期時間

4.位置引數

表示命令列向shell指令碼傳遞的引數

$*、$@ 表示全部引數

$0 指令碼名字

${10} 第10個引數

$# 傳遞到指令碼的引數數量

$$ 指令碼執行的程序號

$? 命令的退出狀態。0,沒有錯誤 非0,有錯誤

5. 引用

(1)

將字串用引用符號引起來,防止特殊字元被shell指令碼解釋為特殊意義。如$、*等有多個意義的字元。引用後特殊字元表現為字面意義

雙引號"" 引用除 美元符$ 反引號` 反斜線\ 之外的所有字元

單引號'' 引用所有的字元

反引號`` shell將反引號中內容解釋為系統命令

反斜線\ 轉義符

雙引號引用變數防止字串分割,保留變數中的空格:

a="A B       C"
echo ${a}      #輸出A B C  丟失了空格
echo "${a}"   #輸出A B       C    防止了字串分割
echo '${a}'    #單引號全引用,輸出  ${a} 這樣的字面字串

(2)命令替換

將命令的標準輸出作為值賦給變數

a=`pwd`
b=$(pwd)    #$() 的方式可以巢狀使用

命令替換返回有多行時,要若不引用命令替換結果,則換行符會被刪除

a=`ls -l .`
echo ${a}    #輸出無換行符,很雜亂
echo "${a}"  #一個檔案/目錄一行顯示