# bash筆記
## 1.第一個腳本
將以下內容保存為test.sh
```
#!/bin/bash
# 這里是注釋內容
echo "hello world"
```
給腳本添加執行權限,以下三個任選一個都可以,-rwxrwxrwx,權限順序ugo,a是所有,省略為a
```
chmod u+x test.sh
chmod +x test.sh
chmod a+x test.sh
```
## 2.第二個腳本,獲取用戶輸入用read
```
#!/bin/bash
echo "please input your age:"
read AGE
echo "your age is $AGE"
```
執行如下
```
[liyongpeng@localhost 桌面]$ ./t.sh
please input your age:
88
your age is 88
```
## 3.變量定義
1.變量名和等號之間不能有空格,這可能和你熟悉的所有編程語言都不一樣
2.定義變量不許要($),使用變量的時候才加美元符($)
3.使用 readonly 命令可以將變量定義為只讀變量,只讀變量的值不能被改變。
4.unset刪除變量,被刪除后不能再次使用;unset 命令不能刪除只讀變量。
```
myUrl="http://www.aaa.com"
myNum=100
echo $myUrl
echo ${myUrl}
readonly myUrl
myUrl="http://www.xxx.com"
echo $myUrl
#執行結果如下,報了一個警告,只讀變量
[liyongpeng@localhost 桌面]$ ./t.sh
http://www.aaa.com
http://www.aaa.com
./t.sh: line 7: myUrl: readonly variable
http://www.aaa.com
```
## 4.特殊變量
$0 當前腳本的文件名
$n 傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。
$# 傳遞給腳本或函數的參數個數。
$* 傳遞給腳本或函數的所有參數。
$@ 傳遞給腳本或函數的所有參數。被雙引號(" ")包含時,與 $* 稍有不同,下面將會講到。
$? 上個命令的退出狀態,或函數的返回值。
$$ 當前Shell進程ID。對于 Shell 腳本,就是這些腳本所在的進程ID。
$* 和 $@ 都表示傳遞給函數或腳本的所有參數,不被雙引號(" ")包含時,都以"$1" "$2" … "$n" 的形式輸出所有參數。
但當它們被雙引號(" ")包含時,"$*" 會將所有的參數作為一個整體,以"$1 $2 … $n"的形式輸出所有參數;"$@" 會將各個參數分開,以"$1" "$2" … "$n" 的形式輸出所有參數。
退出狀態
$? 可以獲取上一個命令的退出狀態。所謂退出狀態,就是上一個命令執行后的返回結果。
退出狀態是一個數字,一般情況下,大部分命令執行成功會返回 0,失敗返回 1。(奇葩)
不過,也有一些命令返回其他值,表示不同類型的錯誤。
## 5.變量替換
-e,使用后替換\n \r\t\v等等
```
echo "you are a pig \n really?"
[liyongpeng@localhost 桌面]$ ./t.sh
you are a pig \n really?
echo -e "you are a pig \n really?"
[liyongpeng@localhost 桌面]$ ./t.sh
you are a pig
really?
#命令結果保存到變量里面,如下
m=`pwd`
echo "$m"
[liyongpeng@localhost 桌面]$ ./t.sh
/home/liyongpeng/桌面
```
${var} 變量本來的值
${var:-word} 如果變量 var 為空或已被刪除(unset),那么返回 word,但不改變 var 的值。
${var:=word} 如果變量 var 為空或已被刪除(unset),那么返回 word,并將 var 的值設置為 word。
${var:?message} 如果變量 var 為空或已被刪除(unset),顯示message,否則顯示變量var。
若此替換出現在Shell腳本中,那么腳本將停止運行。
${var:+word} 如果變量 var 被定義,那么返回 word,但不改變 var 的值。
可以這么理解,-不改變原來的值,=賦值,+和?相反
## 6.運算
+-*/% (加減乘除取于),注意
val=`expr 2 + 2`
echo "Total value : $val"
三點注意:
表達式和運算符之間要有空格,例如 2+2 是不對的,必須寫成 2 + 2,這與我們熟悉的大多數編程語言不一樣。
完整的表達式要被 ` ` 包含,注意這個字符不是常用的單引號,在 Esc 鍵下邊。
乘法必須寫成:val=`expr 12 \* 2`,加反斜線
比較運算
-eq 檢測兩個數是否相等,相等返回 true。 [ $a -eq $b ] 返回 true。
-ne 檢測兩個數是否相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 檢測左邊的數是否大于右邊的,如果是,則返回 true。 [ $a -gt $b ] 返回 false。
-lt 檢測左邊的數是否小于右邊的,如果是,則返回 true。 [ $a -lt $b ] 返回 true。
-ge 檢測左邊的數是否大等于右邊的,如果是,則返回 true。 [ $a -ge $b ] 返回 false。
-le 檢測左邊的數是否小于等于右邊的,如果是,則返回 true。 [ $a -le $b ] 返回 true。
布爾運算
! 非運算,表達式為 true 則返回 false,否則返回 true。 [ ! false ] 返回 true。
-o 或運算,有一個表達式為 true 則返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 與運算,兩個表達式都為 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。
## 7.字符串拼接
your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
提取與查找
your_name="0123456789"
echo ${your_name:1:6} #123456
string="Alibaba is a great company"
echo `expr index "$string" b`#4
注意
提取的時候,第一位是0開始,查找的時候第一位從1開始,好奇怪~~
查找不到會返回0
## 8.數組
arr=('555' '666' '9999999999')
echo "first is :"${arr[0]}
echo "all is :"${arr[*]}
echo "all is :"${arr[@]}
# 取得數組元素的個數
lengtha=${#arr[@]}
# 或者
lengthb=${#arr[*]}
# 取得數組單個元素的長度
lengthc=${#arr[2]}
echo $lengtha
echo $lengthb
echo $lengthc
## 9.輸出
echo -e "first is :"${arr[0]}"\nzhuanyi"//必須使用-e轉義
printf "first is :"${arr[0]}"\nzhuanyi"//不需要-e
## 10.if語句
if ...then... fi 語句;
if ...then... else ... fi 語句;
if ...then... elif ...then... else ... fi 語句。
9.case,esac
//==========示例==========
#!/bin/bash
option="${1}"
case ${option} in
-f) FILE="${2}"
echo "File name is $FILE"
;;
-d) DIR="${2}"
echo "Dir name is $DIR"
;;
*)
echo "`basename ${0}`:usage: [-f file] | [-d directory]"
exit 1 # Command to come out of the program with status 1
;;
esac
//==========結果===============
$./test.sh
test.sh: usage: [ -f filename ] | [ -d directory ]
$ ./test.sh -f index.htm
$ vi test.sh
$ ./test.sh -f index.htm
File name is index.htm
$ ./test.sh -d unix
Dir name is unix
這個例子,開始真沒看懂~評論說$1,$2是參數,還沒反映過來,看他的運行結果,懂了!
10.for
for loop in 1 2 3 45 6
do
echo $loop
done
- 前言
- Interview
- 01-cookie與session
- 04-mysql索引
- 05-memcache與redis
- 06-高并發
- 07-主從同步
- 08-myisam與inondb
- 09-框架區別
- 10-php7新特性
- 11-設計模式
- 12-MySQL優化
- 13-php自動加載機制
- 14-MongoDB命令
- 15-Python爬蟲之scrapy框架
- 16-php運行原理
- 17-單點登錄
- Linux
- linux常見命令
- awk
- sed
- bash-shell
- vim學習教程
- PHP
- php運行機制
- php執行效率
- word2pdf
- php預覽Word
- wechat_wafter2
- Python
- python
- win-bat
- svn操作命令
- git常用操作命令
- git_install
- gitlab安裝
- nextcloud
- docker