shell入门学习笔记-03变量与函数

系列目录与参考文献传送门: 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
  • 通过$?获取函数的返回值。

你可能感兴趣的:(Shell,shell学习笔记)