变量
变量由字母,数字,下划线组成
myname="周浩滨" #声明变量
readonly myname #变量声明为只读
echo ${myname} #使用$取变量值
unset myname #删除变量
echo ${myname} #值为空
变量类型
- 局部变量
- 环境变量
- shell变量
字符串
str='haobin'
echo 'myname is ${str}' #单引号内所有内容都会照常输出
echo "myname is ${str}" #双引号内可以有变量和转义字符
#字符串拼接
echo 'myname is'${str}'!' #使用单引号拼接
echo "myname is"${str}"!" #使用双引号拼接
字符串长度
echo ${#str}
提取子字符串
索引从0开始
echo ${str:1:3} #从索引为1的位置开始,截取4个字符
参数传递
执行脚本时,可向脚本传递参数,脚本内获取参数的途径为$n
参数处理 | 说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | "$1 $2 … $n"的形式输出所有参数。 |
$$ | 脚本运行的当前进程ID号 |
$@ | “$1"”$2"…"$n"形式输出所有参数 |
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
echo "参数个数:$#";
echo "所有参数:$*"
echo "所有参数:$@"
[root@VM-20-16-centos cmd]# sh shell 1 2 3
Shell 传递参数实例!
执行的文件名:shell
第一个参数为:1
第二个参数为:2
第三个参数为:3
参数个数:3
所有参数:1 2 3
所有参数:1 2 3
基本运算符
通过expr能实现表达式的求值操作
val=`expr 2 + 2`
echo "两数之和为 : $val"
两数之和为4
算术运算符
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | expr $a + $b 结果为 30。 |
- | 减法 | expr $a - $b` 结果为 -10。 |
* | 乘法 | expr $a \* $b 结果为 200。 |
/ | 除法 ` | 'expr $b / $a` 结果为 2。 |
% | 取余 | expr $b % $a 结果为 0。 |
= | 赋值 | ‘expr a=$b’ 把变量 b 的值赋给 a。 |
== | 相等 | 用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。 |
!= | 不相等 | 用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。 |
关系运算符
运算符 | 说明 | 举例 |
---|---|---|
-eq | 检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
-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 |
布尔运算符
运算符 | 说明 | 举例 |
---|---|---|
&& | 逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
|| | 逻辑的 OR | [[ $a -lt 100 || $b -gt 100 ]] 返回 true |
字符串运算符
运算符 | 说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
!= | 检测两个字符串是否不相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
-z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 false。 |
-n | 检测字符串长度是否不为 0,不为 0 返回 true。 | [ -n “$a” ] 返回 true。 |
$ | 检测字符串是否不为空,不为空返回 true。 | [ $a ] 返回 true。 |
练习
统计所有进程占用内存百分比的和
假设 nowcoder.txt 内容如下:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.4 77744 8332 ? Ss 2021 1:15 /sbin/init noibrs splash
root 2 0.0 0.0 0 0 ? S 2021 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? I< 2021 0:00 [kworker/0:0H]
daemon 486 0.0 0.1 28340 2372 ? Ss 2021 0:00 /usr/sbin/atd -f
root 586 0.0 0.3 72308 6244 ? Ss 2021 0:01 /usr/sbin/sshd -D
root 12847 0.0 0.0 4528 68 ? S< Jan03 0:13 /usr/sbin/atopacctd
root 16306 1.7 1.2 151964 26132 ? S<sl Apr15 512:03 /usr/local/aegis/aegis_client/aegis_11_25/AliYunDun
root 24143 0.0 0.4 25608 8652 ? S<Ls 00:00 0:03 /usr/bin/atop -R -w /var/log/atop/atop_20220505 600
root 24901 0.0 0.3 107792 7008 ? Ss 15:37 0:00 sshd: root@pts/0
root 24903 0.0 0.3 76532 7580 ? Ss 15:37 0:00 /lib/systemd/systemd --user
root 24904 0.0 0.1 111520 2392 ? S 15:37 0:00 (sd-pam)
以上内容是通过ps aux命令输出到nowcoder.txt文件中的,请你写一个脚本计算一下所有进程占用内存大小的和。
total=0;
for mem in `cat nowcoder.txt | tr -s ' ' ',' | cut -d ',' -f 4 | sed -n '2,$p'`
do
total=`echo "${total},${mem}" | awk -F ',' '{printf("%.1f\n",$1+$2)}'`;
done
printf "%.1f" ${total}
打印字母数小于8的单词
写一个bash脚本以统计一个文本文件nowcoder.txt中字母数小于8的单词。
示例:
假设 nowcoder.txt 内容如下:
how they are implemented and applied in computer
你的脚本应当输出:
how
they
are
and
applied
in
说明:
不用担心你输出的空格以及换行的问题
a=8
for str in `cat nowcoder.txt | tr ' ' '\n'`
do
if [ ${#str} -lt 8 ]
then
echo "${str}"
fi
done