Shell : 基础学习

写在前面

shell脚本语言就跟和几个人聊天类似。你只需把所有命令想象成能帮你做事的那些人,只要你用正确的方式来请求他们去做。

~ % who am I
jdchi  ttys000 Jul 29 10:33 
~ % date
20217月29日 星期四 10时40分27秒 CST

第一个 Shell 脚本

#!/bin/bash
echo "Hello World"

#!是一个约定标记,告诉系统这个脚本需要什么解释器

运行 Shell 脚本

chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本

./表示告诉系统在当前目录找,否则系统会去 PATH 目录里找。

从键盘获取输入

#!/bin/bash

echo "What's your name"
read NAME
echo "My name is $NAME"

将键盘输入分配给变量 NAME

shell % chmod +x ./test2.sh
shell % ./test2.sh 
What's your name
JD
My name is JD

多行注释

:<<EOF
注释
注释
注释
EOF

Shell 变量

变量名和等号之间不能有空格!

只读变量

#!/bin/bash
myName="hello"
readonly myName
myName="hi"
./shell_var.sh: line 5: myName: readonly variable

删除变量

#!/bin/bash
hello="hello"
unset hello
echo $hello

没有任何输出

变量类型

  • 局部变量
    • 在脚本或命令中定义,仅在当前 shell 实例中有效,其它 shell 启动的程序不能访问局部变量
  • 环境变量
    • 所有的程序都能访问,必要的时候 shell 脚本也可以定义环境变量
  • shell变量
    • shell 程序设置的特殊变量

Shell 数组

支持一维数组

定义数组

用括号来表示数组,用空格分隔开。

#!/bin/bash
array=(1 2 3 4)
echo ${array[0]}

读取数组

#读取某个元素
value=${array[1]}
#读取数组中的所有元素
echo ${array[*]}
echo ${array[@]}

获取数组长度

echo ${#array[*]}

Shell 传递参数

在执行脚本的时候,向脚本传递参数,在脚本内获取参数的格式为:$n,n代表第n个参数。

$0 为执行的文件名

#!/bin/bash
echo "文件名为 $0"
echo "第一个参数为 $1"
echo "第二个参数为 $2"
shell % ./shell_args.sh aa bb
文件名为 ./shell_args.sh
第一个参数为 aa
第二个参数为 bb

特殊字符

echo "参数的个数为 $#"
echo "用单字符串显示所有的参数 $*"
echo "当前的进程 ID 为 $$"
echo "后台运行的最后一个进程 ID 为 $!"
echo "Shell 当前使用的选项 $-"
# 0 表示没有错误
echo "最后命令的退出状态 $?"

Shell 基本运算符

原生 bash 不支持简单的数学运算,但可以通过其它命令来实现,例如 awk 和 expr。

算术运算符

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

#!/bin/bash

a=10
b=20

echo a = $a 
echo b = $b
echo a + b = `expr $a + $b`
echo a - b = `expr $a - $b`
shell % ./cal.sh
a = 10
b = 20
a + b = 30
a - b = -10

关系运算符

#!/bin/bash
a=10
b=20

echo a = $a
echo b = $b

# 两个数是否相等
if [ $a -eq $b ]
then
	echo a 与 b 相等
else
	echo a 与 b 不相等
fi
# 两个数是否不相等
if [ $a -ne $b ]
then
	echo a 与 b 不相等
else
	echo a 与 b 相等
fi

# 左边的数是否大于右边
if [ $a -gt $b ]
then
	echo a 比 b 大
else
	echo a 比 b 小
fi

# 左边的数是否小于右边
if [ $a -lt $b ]
then
	echo a 比 b 小
else
	echo a 比 b 大
fi

# 左边的数是否大于等于右边
if [ $a -ge $b ]
then
	echo a 大于等于 b
else
	echo a 小于 b
fi

# 左边的数是否小于等于右边
if [ $a -le $b ]
then
	echo a 小于等于 b
else
	echo a 大于 b
fi
shell % ./rel_operator.sh
a = 10
b = 20
a 与 b 不相等
a 与 b 不相等
a 比 b 小
a 比 b 小
a 小于 b
a 小于等于 b

布尔运算符

#!/bin/bash
a=10
b=100

# 非运算
if [ a != b ]
then
	echo a 不等于 b
else
	echo a 等于 b
fi

# 与运算
if [ $a -eq 10 -a $b -eq 100 ]
then
	echo a 等于 10 b 等于 100
else
	echo a 或 b 不等于初始值
fi

# 或运算
if [ $a -eq 10 -o $b -eq 100 ]
then
	echo a 等于 10 或 b 等于 100
else
	echo a 和 b 不等于初始值
fi
shell % ./bool_operator.sh
a 不等于 b
a 等于 10 b 等于 100
a 等于 10 或 b 等于 100

字符串运算符

#!/bin/bash
a='abc'
b='def'

if [ $a = $b ]
then
	echo a 与 b 相等
else
	echo a 与 b 不相等
fi

if [ $a != $b ]
then
	echo a 与 b 不相等
else
	echo a 与 b 相等
fi

# 检测字符串长度是否为 0
if [ -z $a ] 
then
	echo a 的长度为 0
else
	echo a 的长度不为 0
fi

# 检测字符串长度是否不为 0
if [ -n $b ] 
then
	echo b 的长度不为 0
else
	echo b 的长度为 0
fi

# 检测字符串是否为空
if [ $a ] 
then
	echo a 不为空
else
	echo a 为空
fi
shell % ./string_operator.sh
a 与 b 不相等
a 与 b 不相等
a 的长度不为 0
b 的长度不为 0
a 不为空

文件测试运算符

#!/bin/bash

file="cal.sh"

if [ -r $file ]
then
	echo 文件可读
else
	echo 文件不可读
fi

if [ -w $file ]
then
	echo 文件可写
else
	echo 文件不可写
fi

if [ -x $file ]
then
	echo 文件可执行
else
	echo 文件不可执行
fi

if [ -f $file ]
then
	echo 文件为普通文件
else
	echo 文件为特殊文件
fi

if [ -d $file ]
then
	echo 文件为目录
else
	echo 文件不是目录
fi

if [ -s $file ]
then
	echo 文件不为空
else
	echo 文件为空
fi

if [ -e $file ]
then
	echo 文件存在
else
	echo 文件不存在
fi
shell % ./file_operator.sh
文件可读
文件可写
文件可执行
文件为普通文件
文件不是目录
文件不为空
文件存在

Shell print 命令

printf 命令模仿 C 程序库,移植性比 echo 好。

语法:printf format-string [arguments…]

printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234

郭靖 男 66.12

%-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。

%-4.2f 指格式化为小数,其中 .2 指保留2位小数。

Shell test 命令

test 命令用于检查某个条件是否成立。

num1=100
num2=100
if test $[num1] -eq $[num2]
then
    echo '两个数相等!'
else
    echo '两个数不相等!'
fi
两个数相等!

Shell 流程控制

for 循环

格式

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

示例

#!/bin/bash
array=(1 2 3 4 5)
for i in ${array[@]}
do
	echo $i
done
shell % ./process_control.sh
1
2
3
4
5

while 语句

格式

while condition
do
    command
done

示例

#!/bin/bash
a=0
while (($a<=5))
do
	echo $a
	let "a++"
done
0
1
2
3
4
5

case … esac

类似于 switch case,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,用 esac 表示结束标记。

格式

casein
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

示例

#!/bin/bash
echo 输入数字
read num
case $num in
	  1) echo 选择了 1
    ;;
    2) echo 选择了 2
    ;;
    *) echo 选择了其它
    ;;
esac

Shell 函数

格式

[ function ] funname [()]

{

    action;

    [return int;]

}

示例

#!/bin/bash

fun(){
	echo 自定义函数
}

fun

funWithParam(){
	echo 第一个参数为 $1
	echo 第二个参数为 $2
}

funWithParam 1 3

funWithReturn(){
	return 1
}

funWithReturn2(){
	return 2
}

funWithReturn

echo 返回值为 $?

funWithReturn2

echo 返回值为 $?
shell % ./fun.sh
自定义函数
第一个参数为 1
第二个参数为 3
返回值为 1
返回值为 2

Shell 输入/输出重定向

大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。

输出重定向

shell % touch myfile
shell % who > myfile
shell % echo 'hello' > myfile
shell % cat myfile
hello
shell % echo 'hello again' >> myfile
shell % cat myfile                  
hello
hello again

输入重定向

shell % wc -l myfile 
       2 myfile
shell % wc -l < myfile
       2

参考

Shell 教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值