shell编程笔记
shell就是以文件形式运行一些shell命令的脚本。
sh文件运行方式
-
-
source aa.sh
-
./aa.sh 如果以此种方式执行脚本,这个脚本必须要有可执行权限
chomd a+x aa.sh 给文件赋权 执行权限
-
-
#!/bin/bash
-
#!/usr/bin/env bash
python 的第一行是!/usr/bin/env python
第一行的注释,电脑在运行脚本时,会解析。用来表示默认的脚本命令
#!/bin/bash a=10 echo $a echo 'hello$a' echo I am `whoami` echo "good afternoon$a"
执行文件 bash shell.sh
执行结果如下:
10
hello$a
I am ftpuser
good afternoon10
解析:
定义变量的时候 a=10 等号前后不能有空格
引用变量使用 $ 符号
单引号、双引号、反引号的区别:
单引号:原样输出。可以看出以上代码 echo 'hello$a' 输出结果为hello$a
双引号:双引号里边的内容会读取变量的值
反引号:反引号里边的内容会被解释成linux命令。如上命令 `whoami` 是linux命令
变量
变量种类
- 位置变量:$1 $2 ......$n 表示第n个参数的值
- 预定义变量 : 主要是$的使用
shell.sh 文件内容
# $的使用 echo $0 echo '$1的值'$1 echo '$2的值'$2 echo '$#的值'$# echo '$*的值'$* echo '$@的值'$@ echo '$?的值'$?
echo $(whoami) echo $((1+2))
执行shell文件
bash shell.sh 12 23 aa 传入3个参数
执行结果:
shell.sh
$1的值12
$2的值23
$#的值3
$*的值12 23 aa
$@的值12 23 aa
$?的值0ftpuser
3总结: $0 是指文件名称
$1 是指传入的第一个参数的值
$*、$@ 是指输出所有传入参数的值
$?是指上个程序执行的结果,成功为0,不成功为其他。
$# 是指参数个数
$(命令)是指执行括号里的命令 相当于 `whoami`
$((表达式)) 计算表达式的值,需要用2个小括号
- 环境变量:
定义环境变量:export x=aa
要取文件里的环境变量的值,需要使用source来执行文件,然后echo $x才会出来结果
#环境变量的使用 export X=aaa
执行文件:
source shell.sh
执行完后打印X的值:
echo $X 会输出aaa的值。
如果使用bash执行该脚本,则不会打印出X的值
修改环境变量:
export PATH=$PATH:/home/chris/mybin 在原有的环境变量下加上现在命令所在的目录即可。
但是这是暂时的,如果需要持久化,需要改~/.bashrc文件内容,最后一列加上
export PATH=$PATH
然后执行该文件 source ~/.bashrc 即可
变量运算
或者是如下写法
$((1+2)) 多个表达式用逗号隔开
$[1+2]
-bash-3.2$ a=((1+2)) -bash-3.2$ echo a 3
if语句的基本使用
- 语法结构
-
if conditions; then 语句块 else 语句块 fi条件后边的分号不加也行
-
- 数值比较
- -eq 等于 -ne不等于
- -lt 小于 -gt 大于
- -le 小于等于 -ge 大于等于
-
if [ 3 -gt 2 ] then echo '3>2' else echo '3不等于2' fi注意:if后边的条件 用中括号。中括号前后必须有空格。
- 字符串比较
-
-
read -p "请输入一个字符串" x read -p "请再输入一个字符串" y if [ $x = $y ]; then echo 'x=y' else echo 'x!=y' fi!= 不等于 [[ a>b ]] 大于和小于要用2个中括号。条件中等号两边也必须要有空格
-
-
- 判断是否是文件
read -p "请输入一个路径" path
if [ -d $path ]
then
echo '是文件夹'
else
echo '不是文件夹'
fi
-d 判断是否是文件夹。还有判断是否是文件等,可以自行查询了解。
case语句
read -p '输入一个值' op case $op in 1) echo 添加用户 ;; 2) echo 删除用户 ;; 3) echo 查询用户 ;; *) echo 无操作 esac
case只判断等于的情况
for循环语句
for循环有2个方式
- for i in `seq 1 10`
- do
- 语句块
- done
- do
- for ((i=0;i<=10;i++))
do
语句块
done
#for循环的使用
for i in `seq 1 10`
do
echo $i
done
函数的使用
function可以省略不写。直接在最后传参
function foo()
{
echo $0
echo $1
echo $2
echo $#
}
foo 12 34 45 gg 调用函数。不加括号
结果:
shell.sh
12
34
4
数组
多维数组就是数组嵌套数组
[1,2,3,[hello],5]
names=(hello good 12 34 8) #定义一个数组
echo $names[1] #结果为hello[1] 而不是good 原因是 $names 当成一个整体,默认获取数组里的第0个数据。解决方法:加上大括号
echo ${names[1]} #获取第一个值
echo ${names[*]}或者echo ${names[@]} # 获取所有值
echo ${#names[@]} #获取长度
遍历数组
for i in ${names[*]}
do
echo $i
done
for((x=0;x<${#names[*]});x++)
do
echo ${names[x]}
done
浙公网安备 33010602011771号