Shell基础

1 变量

1.0 命名

  • 变量名和等号之间不能有空格;
  • 只能由英文,数字和下划线组成;
  • 首字母不能以数字开始;
  • 不能使用标点符号;
  • 不能使用bash关键字;
  • 定义变量时不需要美元$符号;
  • 使用help直接获取bash内置关键字;
名称旁边的星号(*)表示该命令被禁用。

 job_spec [&]                            history [-c] [-d 偏移量] [n] 或 hist>
 (( 表达式 ))                            if 命令; then 命令; [ elif 命令; the>
 . 文件名 [参数]                         jobs [-lnprs] [任务声明 ...] 或 jobs>
 :                                       kill [-s 信号声明 | -n 信号编号 | >
 [ 参数... ]                             let 参数 [参数 ...]
 [[ 表达式 ]]                            local [option] 名称[=值] ...
 alias [-p] [名称[=值] ... ]             logout [n]
 bg [任务声明 ...]                       mapfile [-d 分隔符] [-n 计数] [-O >
 bind [-lpvsPSVX] [-m 键映射] [-f 文>   popd [-n] [+N | -N]
 break [n]                               printf [-v var] 格式 [参数]
 builtin [shell 内建 [参数 ...]]         pushd [-n] [+N | -N | 目录]
 caller [表达式]                         pwd [-LP]
 case 词 in [模式 [| 模式]...) 命令 ;;>  read [-ers] [-a 数组] [-d 分隔符] [->
 cd [-L|[-P [-e]] [-@]] [目录]           readarray [-n 计数] [-O 起始序号] [->
 command [-pVv] 命令 [参数 ...]          readonly [-aAf] [名称[=值] ...] 或 r>
 compgen [-abcdefgjksuv] [-o 选项]  [->  return [n]
 complete [-abcdefgjksuv] [-pr] [-DE] >  select NAME [in 词语 ... ;] do 命令;>
 compopt [-o|+o 选项] [-DE] [名称 ...>   set [--abefhkmnptuvxBCHP] [-o 选项名>
 continue [n]                            shift [n]
 coproc [名称] 命令 [重定向]             shopt [-pqsu] [-o] [选项名 ...]
 declare [-aAfFgilnrtux] [-p] [名称[=>  source 文件名 [参数]
 dirs [-clpv] [+N] [-N]                  suspend [-f]
 disown [-h] [-ar] [jobspec ... | pid >  test [表达式]
 echo [-neE] [参数 ...]                  time [-p] 管道
 enable [-a] [-dnps] [-f 文件名] [名称>  times
 eval [参数 ...]                         trap [-lp] [[参数] 信号声明 ...]
 exec [-cl] [-a 名称] [命令 [参数 ...]>  true
 exit [n]                                type [-afptP] 名称 [名称 ...]
 export [-fn] [名称[=值] ...] 或 expor>  typeset [-aAfFgilnrtux] [-p] 名称[=>
 false                                   ulimit [-SHabcdefiklmnpqrstuvxPT] >
 fc [-e 编辑器名] [-lnr] [起始] [终结]>  umask [-p] [-S] [模式]
 fg [任务声明]                           unalias [-a] 名称 [名称 ...]
 for 名称 [in 词语 ... ] ; do 命令; do>  unset [-f] [-v] [-n] [名称 ...]
 for (( 表达式1; 表达式2; 表达式3 )); >  until 命令; do 命令; done
 function 名称 { 命令 ; } 或 name () {>  variables - 一些 shell 变量的名称>
 getopts 选项字符串 名称 [参数]          wait [-n] [编号 ...]
 hash [-lr] [-p 路径名] [-dt] [名称 ..>  while 命令; do 命令; done
 help [-dms] [模式 ...]                  { 命令 ; }

1.2 变量赋值

1.2.1 直接赋值

name="tianlanlan"

1.2.2 语句赋值

将/et目录下的文件名遍历出来

for file_name in `ls /etc`
for file in $(ls /etc)

1.2.3 获取变量值

美元符号:$

#! /bin/bash
echo "hello world!"
name="tianlanlan"
echo $name
  • Result
hello world!
tianlanlan

1.2.4 输出变量值

echo

#! /bin/bash
echo "hello world!"

其中,#!选择脚本解释器,/bin/bash解释器.

for file_name in `ls ~/xinPrj`; do
    echo $file_name
done
  • Result
docker
dpkg
drirc

1.2.5 只读变量

#! /bin/bash
name="tianlanlan"
readonly name
name="shuiqingqing"

1.2.6 删除变量

#! /bin/bash
name="shuiqingqing"
unset name

1.3 字符串

1.3.1 单引号

  • 单引号的任何字符都会原样输出,单引号字符串中的变量是无效的
  • 单引号字符串中不能出现单独一个的单引号,但是可成对出现,作为字符串pinj使用

1.3.2 双引号

  • 双引号里可以有变量
  • 双引号里可以有转义符

1.3.3 字符串拼接

#! /bin/bash
name="shui"
name_a="$name qingqing"
echo $name_a

1.3.4 字符串长度

#! /bin/bash
name="shui"
name_b="$name qingqing"
echo ${#name_b}
  • Result
14

1.3.5 提取字符

#! /bin/bash
name="shuiqingqing"
echo ${name: 1:5}
  • Result
huiqi

1.3.6 查找字符

输出i的位置(不是索引)

#! /bin/bash
name_a = "shuiqingqing"
echo `expr index "$name_a" i`
  • Result
4

1.4 数组

1.4.1 定义数组

array_name=(value_1 value_2 ... value_n)

数组元素用空格隔开.

1.4.2 数组值索引

  • 索引单个元素
value=${array_name[i]}
  • 获取所有元素
value=${array_name[@]}
value=${array_name[*]}
  • Demo
#! /bin/bash
info=('tianlanlan' 25)
echo info[0]:${info[0]}
echo info value: ${info[@]}
echo info value: ${info[*]}
  • Result
info[0]:tianlanlan
info value: tianlanlan 25
info value: tianlanlan 25

1.4.3 数组长度

  • Demo
#! /bin/bash
info=('tianlanlan' 25)
echo info[0]:${info[0]}
echo info value: ${#info[@]}
echo info value: ${#info[*]}
  • Result
2
2

2 注释

2.1 单行注释

# 我是单行注释

2.2 多行注释

  • 第一种方式
:<
  • 第二种方式
:<<'
我
是
多
行
注释
'
  • 第三种方式
:<

3 参数传递

分别表示传递的第i个参数,其中$0为当前文件名,$1,…,n表示第1至n个传递的参数.

$0 $1 ... $n
序号 指令 功能
1 $# 传递到脚本的参数个数
2 $* 以一个单字字符串显示所有向脚本传递的参数
3 $$ 脚本运行的当前进程ID
4 $! 后台运行的最后一个进程ID
5 $@ 返回传递到脚本的全部参数
6 $- 显示shell使用的当前选项
7 $? 显示最后命令的退出状态
  • $*$@
    都是显示传递的所有参数,但是:"*"表示"250 250","@"表示"250","250"

4 运算符

4.1 算术运算符

原生bash不支持简单的数学计算,但是可以通过其他命令实现,如awk,expr,其中expr最常用.
表达式和运算符之间要有空格,如125 + 125

序号 运算符 说明
1 + 加法
2 - 减法
3 \* 乘法
4 / 除法
5 % 取余
6 = 赋值
7 == 相等,若数字相等,则返回true
8 != 不相等,若数字不相等,返回true
  • Demo
#! /bin/bash
# add
add=`expr 125 + 125`
echo "add: $add"
# subtraction
sub=`expr 12 - 4`
echo subtraction: $sub

# multiplication
mul=`expr 50 \* 5`
echo multiplication: $mul

# division
div=`expr 4 / 3`
echo division: $div

if [ 1 == 1 ]
then
    echo equal
else
    echo not equal
fi

if [ 1 != 3 ]
then
    echo not equal
else
    echo equal
fi
  • Result
add: 250
subtraction: 8
multiplication: 250
division: 1
equal
not equal

4.2 关系运算符

序号 运算符 描述
1 -eq 两个数是否相等,相等返回true
2 -ne 两个数是否不等,不等返回true
3 -gt 左边数大于右边,返回true
4 -lt 左边小于右边,返回true
5 -ge 左边大于等于右边,true
6 -le 左边小于等于右边,true

4.3 布尔运算符

序号 运算符 描述
1 ! 不等于,返回true
2 -o 或运算
3 -a 与运算
  • Demo
#! /bin/bash
a=25
b=250
c=0
if [ $a -o $b ]
then
    echo 至少一个为真
fi

if [ $a -a $c ]
then 
    echo 至少一个为假
fi
  • Result
至少一个为真
至少一个为假

4.4 逻辑运算符

序号 运算符 描述
1 && 逻辑与
2 || 逻辑或
  • Demo
a=2500
b=250
c=0
if [[ $a -gt $b && $a -gt $c ]]
then
    echo a is largest
else
    echo a is not largest
fi
  • Result
a is largest

4.5 字符串运算符

序号 运算符 描述
1 = 字符串相等,true
2 != 字符串不相等,true
3 -z 字符串长度为0,true
4 -n 字符串长度不为0,true
5 $ 字符串不为空,true
  • Demo
#! /bin/bash
s1="tianlanlan"
s2="shuiqingqing"
s3=""
if [ $s1 != $s2 ]
then
    echo s1 and s2 was differ
fi

if [ -z $s1 ]
then
    echo s1 was empty
else
    echo s1: $s1
fi
if [ $s3 ]
then 
    echo s3: $s3
else
    echo s3 was empty
fi
  • Result
s1 and s2 was differ
s1: tianlanlan
s3 was empty

4.6 文件测试运算符

序号 运算符 描述
1 -b file 文件为块设备文件,true
2 -c file 文件为字符设备文件,true
3 -d file 文件为目录,true
4 -f file 文件为普通文件(非目录或设备文件),true
5 -g file 文件设置SGID位,true
6 -k file 文件设置粘着位(sticky bit),true
7 -p file 文件有名管道,true
8 -u file 文件设置了SUID位,true
9 -r file 文件可读,true
10 -w file 文件可写,true
11 -x file 文件可执行,true
12 -s file 文件不为空,true
13 -e file 文件存在,true
  • Demo
file=`pwd`/test.sh
dir=`pwd`
echo current director: $dir
echo current file: $file
if [-d $dir ]
then
    echo dir is a directory
else
    echo dir is not a directory
fi
if [ -f $file ]
then 
    echo file is a normal file
else
    echo file is not a file
fi
  • Result
current director: /home/xdq/xinPrj/Shell
current file: /home/xdq/xinPrj/Shell/test.sh
dir is a directory
file is a normal file

5 echo

功能:输出字符串
格式:

echo string

5.1 显示普通字符串

echo hello
echo "Hello"

5.2 显示变量

name="tianlanlan"
echo $name
echo "$name"

5.3 显示换行/不换行

  • 换行
echo -e "hello \n"
echo "world"
  • 不换行
echo -e "hello \c"
echo "world"

5.4 显示结果定向至文件

  • 将数据写入对应文件,替换之前的文件.
file_another="/home/xdq/xinPrj/Shell/test_another.sh"
txt_file="/home/xdq/xinPrj/Shell/test.txt"
echo "hello" > $txt_file
echo "hello world!" > $file_another
  • Result
    test.txt
hello

test_another.sh

hello
  • 文件追加数据
echo "tianlanlan" >> $file_another
  • Result
    test_another.sh
hello
tianlanlan

5.5 显示命令执行结果

echo `pwd`

6 小结

序号 指令 功能
1 $ 取变量值
2 # 取变量长度
3 @ 全部元素
4 * 全部元素
5 `` 上符号中加入指令即可执行Linux系统命令,如pwd,ls

参考文献
[1]https://www.runoob.com/linux/linux-shell.html
[2]https://www.cnblogs.com/singeryoung/p/9554551.html

你可能感兴趣的:(shell,Linux,python函数)