linux|编写一个shell脚本
编写第一个shell
$vim hello.sh
#!/bin/bash
echo"hello world"
$chmod 777 hello.sh
$./hello.sh
Shell变量
系统变量
用户自定义变量
定义shell变量
变量不可用数字开头
等号两侧不可用空格
变量一般习惯为大写
-
i=114514 echo "$i"
-
静态变量 - redonly 只读不可赋值
-
i=114514 echo "$i" unset i readonly i=10086 echo "$i" unset i
-
将指令结果赋值给变量
S=`date`
echo "S=$S"
S=$(date)
echo "S=$S"
设置环境变量
环境变量
在文件中创建环境变量
自定义环境变量可以在命令行中设置和创建,但用户退出命令时这些变量值就会丢失。如果希望永久保存环境变量,可在用户家目录下的.bash_profile 或 .bashrc文件中,或者全局配置/etc/bashrc或 /etc/profile 文件中定义
在/etc/profile添加:
export MY_HOME=/home/newland #
要使配置的全局变量立即生效
$soure /etc/profile
输出
位置参数变量
- 执行shell脚本的时候如果想要获取到命令行的参数信息
- 如:./xxx.sh a b
- a和b是传入命令行的值
基本语法
- $n |n为数字,$0代表命令本身 $1-$9代表第一到第九个参数,十以上的参数需要用{}包含${10}
- $* | 这个变量代表命令行中的所有参数,$*把所有的参数看做一个整体
- $@ | 这个变量也代表命令行中的所有参数 ,不过$@把每个参数 区分对待
- $# | 这个变量代表命令行中的所有参数的个数
例:
#!/bin/bash
echo "0=$0 1=$1 3=$2"
echo "all = $*"
echo "$@"
echo "count = $#"
echo "$1$2"
输出
newland@newland-VirtualBox:~/shell_learn$ ./position.sh 1 2
0=./position.sh 1=1 3=2
all = 1 2
1 2
count = 2
12
系统定义的变量
-
$$ | 当前进程的进程号(PID)
-
$! | 后台运行的最后一个进程号(PID)
-
$? | 最后一次执行命令的返回状态
- 值为0 正确执行成功 否则执行不正确
例:
#!/bin/bash
echo "id=$$"
./bianliang.sh 12 13 |grep xxx &
echo "- id=$!"
echo "$?"
运算符
shell中的运算符
- $((运算式))或者$[运算式] 或者 expr m+n //expression表达式
- expr 运算符后面要有空格,如果将expr的结果赋值给某个变量,使用``
- expr 运算符前后面要加空格
- expr
\*,/,%
乘除取余
例:
ABC=`expr 2 + 1`
echo "$ABC"
echo "$(($1+$2))"
echo "$[100+200]"
echo `expr 20 \* 10`
输出
newland@newland-VirtualBox:~/shell_learn$ ./YSF.sh 12 12
3
24
300
200
条件判断
判断语句
- = 字符串比较
- 两个整数的比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
- 按照文件权限进行判断
-r 有读的权限
-w 有写的权限
-x 有执行的权限
- 按照文件类型进行判断
-f 文件存在并且是一个常规的文件
-e 文件存在
-d 文件存在并且是个目录
流程控制
if[条件判断式]
then
代码
fi
或者
if[条件判断式]
then
代码
elif[条件判断式]
then
代码
fi
中括号和条件判断中间有空格
例1:
Chengji=$1
if [ $Chengji -gt 60 ]
then
echo "dayu 60"
elif [ $Chengji -lt 60 ]
then
echo "xiaoyu 60"
fi
输出
newland@newland-VirtualBox:~/shell_learn$ ./chengji.sh 61
dayu 60
newland@newland-VirtualBox:~/shell_learn$ ./chengji.sh 56
xiaoyu 60
例2:
if [ -f YSF.sh ]
then
sudo rm -rf /home/newland/YSF.sh
echo "OK"
fi
输出
case语句
语法
case $变量名 in
“值1")
符合值1执行程序
;;
”值2“)
符合值2执行程序
;;
...xxx...
*)
不符合以上条件的程序
;;
esac #结束
例:
case $1 in
"1")
echo "First"
;;
"2")
echo "Second"
;;
"3")
echo "Third"
;;
"4")
echo "Fouth"
;;
*)
echo "$1 th"
;;
esac
输出
for循环
基本语法
#语法1
for 变量 in 值1 值2 值3
do
#程序、代码
down
#语法2
for((初始值;循环控制条件;变量变化))
do
#程序/代码
done
例
for i in "$*"
do
echo "num is $i"
done
echo "<===================================================>"
unset i
for i in "$@"
do
echo "num is $i"
done
#$* & $@的区别
echo "<===================================================>"
unset i
for((i=1;i<=$1;i++))
do
for((j=0;j<i;j++))
do
printf "* "
done
printf "\n"
done
输出
newland@newland-VirtualBox:~/shell_learn$ ./forshell.sh 5 2 3 4 5
num is 5 2 3 4 5
<===================================================>
num is 5
num is 2
num is 3
num is 4
num is 5
<===================================================>
*
* *
* * *
* * * *
* * * * *
while循环
基本语法
while [条件判断式]
do
#程序/代码
done
具体差不多和for循环一样
函数
定义函数格式
[function]funname[()]
{
Action;
[return int;]
}
#调用函数名
#调用直接写函数名
例
function getSum(){
for((i=0;i<10;i++))
do
echo $i
done
}
getSum
输出
newland@newland-VirtualBox:~$ ./func.sh
0
1
2
3
4
5
6
7
8
9
标签:shell,num,变量,echo,newland,sh,linux,编写
From: https://www.cnblogs.com/Xin-chen/p/16871943.html