1)什麼是變量?內存單元,其值可以改變
變量命名規則
1.開頭爲字符或下劃線,名字中間中能有字母、數字和下劃線組成;
2.變量的長度不超過255個字符;
3.變量名在有效的範圍內必須是唯一的; //如再次定義則會替換上一個變量的值
4.在Bash中,變量的默認類型都是字符串型. //即系統把所有值都當作字符串放到變量中,不論這個“字符串”實際上是整數、浮點數等等
變量按照存儲數據常用分類(其他語言):字符串型,整型,浮點型,日期型
2)變量的分類
1.用戶自定義變量 :可以隨意更改
2.環境變量:部分可以更改
3.位置參數變量 //實際就是預定義變量 :系統已經定義完成,不能隨意更改
4.預定義變量:系統已經定義完成,不能隨意更改
3)如何設置用戶自定義變量
1、變量名=變量值
e.g. x=5 注意,變量名只能是字母、下劃線、數字組成且不能以數字開頭,=號左右不可有空格
2、“”會解析特殊符號,例如$,‘’不會解析特殊符號
3、引用變量:$變量名 例如:$x
4、所有變量默認的值都是字符串類型,不可做Math運算
5、變量疊加 e.g y="$x"123 或者 y=${x}123
6、查看變量 set 會列出系統中所有的變量,包括環境變量和自定義變量
set -u //設定當調用不存在變量時,會提示錯誤
7、刪除變量 unset 變量名 例如:unset x
4)環境變量
1.環境變量與用戶自定義變量的區別
環境變量是全局變量,用戶自定義變量是局部變量。
用戶自定義變量只在當前的 shell 中生效,環境變量在當前 shell 和這個 shell 的所有子 shell 中生效。
用戶可以自定義環境變量,但對系統生效的環境變量名和變量作用是固定的。
2.用戶自定義環境變量
$ export 變量名=變量值
或
$ 變量名=變量值
$ export 變量名
3.查看環境變量
$ set 查看所有變量
$ env 查看環境變量
4.刪除環境變量
$ unset 環境名
5.常用的環境變量
HOSTNAME:主機名
SHELL:當前的 shell
TERM:終端環境
HISTSIZE:歷史命令條數
SSH_CLIENT:當前操作環境是用 ssh 連接的,這裏記錄客戶端 ip
SSH_TTY:ssh 連接的終端是 pts/1
USER:當前登錄的用戶
PATH:系統搜索命令的路徑
要想直接通過腳本名執行自己的腳本:
(1)將腳本拷貝至 PATH 中的任意目錄下(不建議這樣做),例如:
$ cp hello.sh /bin/
(2)將腳本所在目錄添加到 PATH 變量中,例如:
$ PATH="$PATH":/root/sh 但系統重啓後失效
PS1:命令提示符設置
\d:顯示日期,格式爲"星期 月 日"
\H:顯示完整的主機名
\t:顯示 24 小時制時間,格式爲"HH:MM:SS"
\A:顯示 24 小時制時間,格式爲"HH:MM"
\u:顯示當前用戶名
\w:顯示當前所在目錄的完整名稱
\W:顯示當前所在目錄的最後一個目錄
\$:提示符。root 用戶爲"#",普通用戶爲"$"
5)語系變量
就是當前支持的語言
當前語系查詢:locale //直接生效的是LANG變量(默認語系) LC_ALL:定義整體語系(不常用)
echo $LANG //當前語系環境
echo $LC_ALL //整體語系環境
locale -a | more 查看Linux支持的所有語系環境
cat /etc/sysconfig/i18n //下次開機以後的系統環境
LANG=zh_CN.UTF-8 //切換成中文
6)位置參數變量
1.位置參數變量
2.例子1:
#!/bin/bash
num1=$1
num2=$2
sum=$(($num1+$num2))
#變量 sum 的和是 num1 加 num2
echo $sum
#打印變量 sum 的值
3.例子2
#!/bin/bash
echo "A total of $# parameters"
使用 $# 代表所有參數的個數
echo "The parameters is:$*"
使用 $* 代表所有的參數
echo "The parameters is:$@"
使用 $@ 代表所有的參數
4.例子3:$* 與 $@ 的區別
#!/bin/bash
for i in "$*"
# $* 中所有參數看成是一個整體,所以這個 for 循環只會循環一次
do
echo "The parameters is:$i"
done
for y in "$@"
# $@ 中每個參數都看成是獨立的,所以 $@ 中有幾個參數,就會循環幾次
do
echo "Parameter:$y"
done
7)預定義變量
程序執行的返回值:
$? :最後一次執行命令的返回狀態,如果正確執行,則返回0;
如果返回爲非零(具體數值由命令決定),則上一條命令執行不正確
執行完一條命令之後,立馬敲入echo $?,可得到返回值。例如:ls 執行之後,再敲入echo $?,可以得到0
前門說到的邏輯或:|| -->ls || echo yes ;前面一條語句正確執行,才執行後一條語句。這裏就是通過執行命令的返回值來判斷的
邏輯與:&& --> ls qwe && echo no 也是同樣的道理
$$:返回當前進程的PID號;
$!:返回後臺的進程PID號;
可以通過一個簡單的shell來展示一下:
sl.sh
#!/bin/bash
ehco "dang qian de PID: $$"
find / hello.sh &
echo "hou tai de PID: $!"
chmod 755 sl.sh,然後再執行:./sl.sh;可以得到當前的測試的結果
read -n
read -p “please input name ” name #-p表示輸出提示信息 read [選項] 變量名
read -t 30 #-t 表示等待時間單位爲秒 -t 30 表示30秒,若30秒後沒有輸入數據終止執行腳本
read -s #隱藏信息
echo -e “\n” 換行符
read.sh:
#!/bin/bash
read -p "please input your name:" -t 30 name
#等下輸入,如果超過30秒不輸入,就終止當前命令
echo $name
read -p "please input your password:" -s pwd
#輸入的值是隱藏的,看不見的,但是在sh裏面還是可以獲取到的,並且輸出的
echo -e "/n"
echo $pwd
read -p "please input your sex [M/F]:" -n 1 sex
#意思就是隻能輸入一個字符,且輸入之後立馬執行
echo -e "/n"
echo $sex
chmod 755 read.sh---> ./read.sh