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 多行注释

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

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值