系列目录与参考文献传送门: shell入门学习笔记-序章
变量
一般情况下,Shell变量都是字符串,无论赋值时是否使用引号,无论是否是一串数字。
三种变量赋值方式
# 三种赋值方式
name=Jack
name='Jack'
name="Jack"
# 错误的赋值方式1:等号两侧有空格
name = Jack
# 错误的赋值方式2:值包含空格但是未使用引号
name=Jack Blue
admindeMacBook-Pro:myshell admin$ TEST_NAME1=shell测试
admindeMacBook-Pro:myshell admin$ TEST_NAME2='shell 测试'
admindeMacBook-Pro:myshell admin$ TEST_NAME3="Shell 测试"
admindeMacBook-Pro:myshell admin$ echo $TEST_NAME1
shell测试
admindeMacBook-Pro:myshell admin$ echo $TEST_NAME2
shell 测试
admindeMacBook-Pro:myshell admin$ echo $TEST_NAME3
Shell 测试
admindeMacBook-Pro:myshell admin$ TEST_NAME4=shell test
admindeMacBook-Pro:myshell admin$ echo $TEST_NAME4
admindeMacBook-Pro:myshell admin$ TEST_NAME5 =shell
-bash: TEST_NAME5: command not found
admindeMacBook-Pro:myshell admin$ TEST_NAME5= shell
-bash: shell: command not found
两种使用变量方式
admindeMacBook-Pro:myshell admin$ TEST_USE1=haha
admindeMacBook-Pro:myshell admin$ TEST_USE11=heihei
admindeMacBook-Pro:myshell admin$ echo $TEST_USE1
haha
admindeMacBook-Pro:myshell admin$ echo $TEST_USE11
heihei
admindeMacBook-Pro:myshell admin$ echo ${TEST_USE1}1
haha1
- 在变量前面添加
$
即可使用变量。 - 大括号
{}
是为了识别变量的边界。 - 推荐所有变量添加
{}
,这是一种好习惯。
单引号与双引号的区别
admindeMacBook-Pro:myshell admin$ TEST_QUOTE="Hello"
admindeMacBook-Pro:myshell admin$ TEST_QUOTE1='origin text ${TEST_QUOTE}'
admindeMacBook-Pro:myshell admin$ TEST_QUOTE2="explain test ${TEST_QUOTE}"
admindeMacBook-Pro:myshell admin$ echo $TEST_QUOTE
Hello
admindeMacBook-Pro:myshell admin$ echo $TEST_QUOTE1
origin text ${TEST_QUOTE}
admindeMacBook-Pro:myshell admin$ echo $TEST_QUOTE2
explain test Hello
-
单引号会保留字符串的原始内容,不对变量和命令进行解释
-
双引号会解释变量中的变量和命令
-
建议数字不加引号
-
建议一般情况用双引号
-
建议特殊需求时才使用单引号
将命令的结果赋值给变量
variable=`command`
variable=$(command)
- 第一种反引号``,此种方式容易与单引号’'混淆,不建议使用。
- 推荐使用
$()
的方式。
admindeMacBook-Pro:myshell admin$ vi log.txt
admindeMacBook-Pro:myshell admin$ TEMP_LOG=`cat log.txt`
admindeMacBook-Pro:myshell admin$ echo $TEMP_LOG
Hello world, This is a log file.
admindeMacBook-Pro:myshell admin$ TEMP_LOG=11
admindeMacBook-Pro:myshell admin$ echo $TEMP_LOG
11
admindeMacBook-Pro:myshell admin$ TEMP_LOG=$(cat log.txt)
admindeMacBook-Pro:myshell admin$ echo $TEMP_LOG
Hello world, This is a log file.
只读变量
admindeMacBook-Pro:myshell admin$ TEMP_LOG=$(cat log.txt)
admindeMacBook-Pro:myshell admin$ echo $TEMP_LOG
Hello world, This is a log file.
admindeMacBook-Pro:myshell admin$ readonly TEMP_LOG
admindeMacBook-Pro:myshell admin$ unset TEMP_LOG
-bash: unset: TEMP_LOG: cannot unset: readonly variable
##
admindeMacBook-Pro:myshell admin$ readonly TEMP_P=111
- 只读变量无法被修改、删除。
删除变量
admindeMacBook-Pro:myshell admin$ set | grep "TEST_*"
TEST_NAME2=$'shell �\213�\225'
TEST_NAME3=$'Shell �\213�\225'
TEST_QUOTE1='origin text ${TEST_QUOTE}'
TEST_QUOTE2='explain test Hello'
TEST_USE1=haha
TEST_USE11=heihei
admindeMacBook-Pro:myshell admin$ unset TEST_NAME2
admindeMacBook-Pro:myshell admin$ unset TEST_NAME3
admindeMacBook-Pro:myshell admin$ unset TEST_QUOTE1
admindeMacBook-Pro:myshell admin$ unset TEST_QUOTE2
admindeMacBook-Pro:myshell admin$ unset TEST_USE1
admindeMacBook-Pro:myshell admin$ unset TEST_USE11
admindeMacBook-Pro:myshell admin$ set | grep "TEST_*"
admindeMacBook-Pro:myshell admin$ set | grep "TEMP_*"
TEMP_LOG='Hello world, This is a log file.'
admindeMacBook-Pro:myshell admin$ unset TEMP_LOG
-bash: unset: TEMP_LOG: cannot unset: readonly variable
- 通过
set
查看变量列表 - 通过
unset
删除变量 unset
不能删除日志变量
取消只读变量
Last login: Fri Jan 4 16:32:43 on ttys003
You have mail.
admindeMacBook-Pro:~ admin$ set | grep "TEMP_*"
admindeMacBook-Pro:~ admin$
- 只读变量不能取消或者删除,只能注销当前shell session
输出结果赋值给变量
admindeMacBook-Pro:myshell admin$ cat a.sh
#!/bin/bash
now=`date`
sleep 1
now1=$(date)
echo ${now}
echo ${now1}
echo "-----------------"
lsl=$(ls -l)
echo ${lsl}
echo "-----------------"
echo "${lsl}"
admindeMacBook-Pro:myshell admin$ ./a.sh
2019年 1月 7日 星期一 14时19分58秒 CST
2019年 1月 7日 星期一 14时19分59秒 CST
-----------------
total 32 -rwxr-xr-x 1 admin staff 159 1 7 14:19 a.sh -rwxr-xr-x 1 admin staff 110 1 7 12:02 b.sh -rw-r--r-- 1 admin staff 127 1 4 17:01 hello.sh -rw-r--r-- 1 admin staff 33 1 7 10:26 log.txt
-----------------
total 32
-rwxr-xr-x 1 admin staff 159 1 7 14:19 a.sh
-rwxr-xr-x 1 admin staff 110 1 7 12:02 b.sh
-rw-r--r-- 1 admin staff 127 1 4 17:01 hello.sh
-rw-r--r-- 1 admin staff 33 1 7 10:26 log.txt
admindeMacBook-Pro:myshell admin$
- 两种方式替换命令:反引号``和
$()
。 - 如果不适用双引号包含输出的变量,则换行符无效,多行变一行。所以建议,输出内容时,添加双引号。
反引号``与$()
admindeMacBook-Pro:myshell admin$ ls
a.sh b.sh hello.sh log.txt
admindeMacBook-Pro:myshell admin$ ls | sed -n '1p'
a.sh
admindeMacBook-Pro:myshell admin$ wc -l a.sh
12 a.sh
admindeMacBook-Pro:myshell admin$ Fir_File_line=$(wc -l $(ls | sed -n '1p'))
admindeMacBook-Pro:myshell admin$ echo $Fir_File_line
12 a.sh
admindeMacBook-Pro:myshell admin$ Fir_File_line=`wc -l `ls | sed -n '1p'``
^C
- 因反引号与单引号易混淆,不建议使用。
- 注意:
$()
只在bash shell中生效,``可以多种shell中使用。 $()
支持嵌套,``不支持。
函数function
admindeMacBook-Pro:myshell admin$ addd()
> {
> return $(($1+$2))
> }
admindeMacBook-Pro:myshell admin$ addd 1 2
admindeMacBook-Pro:myshell admin$ echo $?
3
admindeMacBook-Pro:myshell admin$ function minuss(){ echo $(($1-$2)); }
admindeMacBook-Pro:myshell admin$ minuss 4 1
3
admindeMacBook-Pro:myshell admin$ echo $?
0
- 函数定义,可以不加
function
关键字。 - 函数定义,可以不显示
return
返回值,默认返回0
。 - 通过
$?
获取函数的返回值。