linux中shell编程

123 阅读3分钟

基本格式

hello.sh

#!/bin/bash

echo "Hello World !"

显示行号

#在非编辑模式下
:set nu

#按 i 进入编辑模式

执行方式

#第一种
sh hello.sh

#第二种
#修改了文件的执行权限
chmod u+x hello.sh 
./hello.sh

#第三种
#修改了文件的全部权限
chmod 777 hello.sh 
./hello.sh

shell变量使用

语法格式: 变量=值,如: your_name="itcast.cn"

注意: 变量名和等号之间不能有空格,同时,变量名的命名须遵循如下规则:

  • 首个字符必须为字母( a-z, A-Z)
  • 中间不能有空格,可以使用下划线( _)
  • 不能使用标点符号
  • 不能使用 bash里的关键字(可用 help 命令查看保留关键字)

用法:

#声明变量
your_name="snail"

#使用变量
echo $your_name

#拼接字符串
echo ${your_name} com


date  #当前时间
sleep 0.5 #休眠0.5秒
>  写入到文件覆盖
>> 写入到文件追加
 

修饰符

readonly 可以将变量定义为只读变量,类似final

unset 命令可以删除变量。 不能删除只读变量。

expr 是一款表达式计算工具

let 命令是 BASH 中用于计算的工具

read 修饰输入内容

变量类型

局部变量

局部变量在脚本或命令中定义,仅在当前 shell 实例中有效,其他 shell 启动的程序不能访问局部变量。

环境变量

所有的程序,包括 shell 启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。 可以用过 set 命令查看当前环境变量。

#查看当前系统的环境变量
set

#全局变量文件
/etc/profile

shell变量

shell 变量是由 shell 程序设置的特殊变量。 shell 变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了 shell 的正常运行

#在脚本中使用的变量

参数传递

#向shell脚本里传参
sh hello.sh abc aaa 123

#接收参数
	$0 是脚本本身文件名
	$1 接收第一个参数
	$2 接收第二个参数
	$3 接收第三个参数
	...

特殊字符

$#传递到脚本的参数个数
$*以一个单字符串显示所有向脚本传递的参数。
$$脚本运行的当前进程 ID 号
$!后台运行的最后一个进程的 ID 号
$@与$*相同,但是使用时加引号,并在引号中返回每个参数。
$?显示最后命令的退出状态。 0 表示没有错误,其他任何值表明有错误。

例子

#!/bin/bash
echo "第一个参数为: $1";
echo "参数个数为: $#";
echo "传递的参数作为一个字符串显示: $*";
#执行脚本: ./test.sh 1 2 3

shell运算符

Shell 和其他编程语音一样,支持包括:算术、关系、布尔、字符串等运算符。 原生 bash 不支持简单的数学运算,但是可以通过其他命令来实现,例如

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。例如加,减,乘,除等操作

注意:表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2。完整的表达式要被 ``包含,注意不是单引号,在 Esc 键下边。

#!/bin/bash

name="hello word !"

echo $name

echo ${name} snail

a=10
b=24
#加法运算
echo 'a+b =' `expr $a + $b`
#减法运算
echo 'a-b =' `expr $a - $b`
#乘法运算
echo 'a*b =' `expr $a \* $b`
#除法运算
echo 'b/a =' `expr $b / $a`
#余数运算
echo `expr $b % $a`


count=1

((count++))

echo $count

c=$((1+2))

d=$[1+2]

echo $c $d


流程控制

条件表达式写法

eq 就是 EQUAL 等于 =
nq 就是 NOT EQUAL 不等于 !=
gt 就是 GREATER THAN 大于 >  
lt 就是 LESS THAN 小于 <
ge 就是 GREATER THAN OR EQUAL 大于等于 >=
le 就是 LESS THAN OR EQUAL 小于等于 <=

if else 语句

a=10
b=20

#1.判断a等不等于b

if [ $a -gt $b ]
then
  echo "a>b"
elif [ $a -eq $b ]
then
  echo "a=b"
else
  echo "a<b"
fi

for循环

#方式一
for item in a b c
do
  echo ${item}
done

#方式二
for(( i=0;i<=5;i++ ))
do
  echo $i
done

while语法

i=1
while(( i <= 3 ))
do
  let i++
  echo $i
done

case语句

echo "输入数字"
read aNum
case $aNum in
 1)
    echo "1"
;;
 2)
    echo "2"
;;
 3)
    echo "3"
;;
 *)
    echo "没有"
;;

esac

函数

函数使用

语法:name(){...}

hello(){
    echo "hello word"
    echo $1
    echo $2
}
#运行函数时传参
hello aaa bbb
#接收执行脚本的时候传参
hello $1 $2