Shell入门

变量

变量

变量引用:$ 和 ${}

命令替换

命令输出中提取信息,并将其赋给变量
反引号 和 $()

wu=`命令` 或者 wu =$()

注意:`` 和 $() 与= 不能有空格

echo/读取:read

echo命令可用单引号或双引号来划定文本字符串,便可以正常输出。
echo -n :文本字符串和命令输出显示在同一行中

read -p “Enter your age:” name
echo “hello $name”

read –p 相当于 echo -n 提示作用

read -p "Enter your name: " first last
echo "Checking data for $last, $first…"

-t 指定时间
-s 隐藏输入内容(可用于输入密码)

read 文件内容
count=1
cat test | while read line
do
  echo "Line $count: $line"
  count=$[ $count + 1 ]
done

标准输入输出

ls -la t test3 test4 2>text1 1>text
&>test 则正确和错误输入到同一个文件

运算符

expr

处理数学表达式
ARG1 | ARG2 如果ARG1既不是null也不是零值,返回ARG1;否则返回ARG2
ARG1 & ARG2 如果没有参数是null或零值,返回ARG1;否则返回0
ARG1 % ARG2 返回ARG1被ARG2除的算术余数
*号等运算符识别不出 需要 加 \
expr 5 \* 2

整数运算$[ ]

bash shell数学运算符只支持整数运算
var1=$[1+5]

var1= [ [ [var * 2]


浮点运算 bc

直接输入bc,进行运算
–q 不显示bash计算器冗长的欢迎信息
scale 控制小数位数



if结构化语句

If 条件;then
fi

If 条件;then
else
fi

if 条件;then
elif 条件;then
fi

方括号定义了测试条件。注意,第一个方括号之后和第二个方括号之前必须加上一个空格,否则就会报错
if [ condition ]
then
commands
fi

数值比较

-eq 相等
-ge 大于或等于
-gt 大于
-le 小于或等于
-lt 小于
-ne 不等于

字符串比较

str1 = str2 检查str1是否和str2相同
str1 != str2 检查str1是否和str2不同
str1 < str2 检查str1是否比str2小
str1 > str2 检查str1是否比str2大
-n str1 检查str1的长度是否非0
-z str1 检查str1的长度是否0
-o 或 相当于 ||
-a 和 相当于 &&

>

-n

文件比较

-d file 检查file是否存在并是一个目录
-f file 检查file是否存在并是一个文件
-e file 检查file是否存在
-s file 检查file是否存在并非空
-r file 检查file是否存在并可读
-w file 检查file是否存在并可写
-x file 检查file是否存在并可执行
-O file 检查file是否存在并属当前用户所有
-G file 检查file是否存在并且默认组与当前用户相同
file1 -nt file2 检查file1是否比file2新
file1 -ot file2 检查file1是否比file2旧

复合条件测试

if-then语句允许你使用布尔逻辑来组合测试。有两种布尔运算符可用:
 [ condition1 ] && [ condition2 ]
 [ condition1 ] || [ condition2 ]

用于数学表达式的双括号

双括号:比较过程中使用高级数学表达式
val++ 后增
val-- 后减
++val 先增
–val 先减
! 逻辑求反
~ 位求反
** 幂运算
<< 左位移
/>> 右位移
& 位布尔和
| 位布尔或
&& 逻辑和
|| 逻辑或
== 匹配字符

用于高级字符串处理功能的双方括号

双方括号:针对字符串比较的高级特性
采用的标准字符串比较,具有模式匹配

结构

case

变量和模式是匹配的
通过竖线操作符在一行中分隔出多个模式模式:Y|y
* 会捕获所有与已知模式不匹配的值

shift 移动变量

操作命令行参数
根据它们的相对位置来移动命令行参数
默认情况下它会将每个参数变量向左移动一个位置
即变量$3的值会移到$2中,变量$2的值会移到$1中,而变量$1的值则会被删除

#!/bin/bash
echo "The original:$*"
shift 2	#移动两个位置
echo "The position $1"

双破折线

双破折线表示选项列表结束。在双破折线之后脚本就可以放心地将剩下的命令行参数当作参数,而不是选项来处理了

#!/bin/bash
while [ -n "$1" ]
do
        case "$1" in
                -a) echo "Found the -a option" ;;
                -b) echo "Found the -b option";;
                -c) echo "Found the -c option" ;;
                --) shift
                break ;;
                *) echo "$1 is not an option";;
        esac
shift
done
#
count=1
for param in $@
do
        echo "Parameter #$count: $param"
        count=$[ $count + 1 ]
done

#!/bin/bash
while [ -n "$1" ]
do
case "$1" in
a) echo "print a";;
b) echo "print b";;
--) shift
    break;;
*) echo "$1 is not an option";;
esac
shift
done

count=1
for param in $@
do
echo "param #$count: $param"
count=$[ $count + 1 ]
done

在遇到双破折线时,脚本用break命令来跳出while循环。由于过早地跳出了循环,我们需
要再加一条shift命令来将双破折线移出参数变量

for

for var in list(遍历自身定义一系列值)
do
commands
done

处理循环的输出

#!/bin/bash
for (( a=1;a<10;a++ ))
do
echo “The number is $a”
done > wu.txt
对循环的输出使用管道或进行重定向到文件中

更改字段分隔符

bash shell默认
空格
制表符
换行符
为分隔符
IF=$ 可以制定分隔符
IF=\ $’\n’ ,只有\n为分隔符

c语言for

for (( i = 1; i <= 10; i++ ))
do
command
done

while

while command

设置单个命令

只要测试条件成立, while命令就会不停地循环执行定义好的命令
测试条件中用到的变量必须修改,否则就会陷入无限循环

设置多个命令

只有最后一个测试命令的退出状态码会被用来决定什么时候结束循环

until

untile test commands
do
other commands
done

until条件成立则不执行,条件不成立则执行与 while 相反

设置单个命令

设置多个命令

控制循环

break

退出任意类型的循环
跳出当前正在执行的循环,完全终止整个循环

break n
n指定了要跳出的循环层级

continue

continue命令可以提前中止某次循环中的命令但并不会完全终止整个循环。
跳过此次循环中剩余的命令,但整个循环还会继续。
可以在循环内部设置shell不执行命令的条件。

continue n

实例

查找可执行文件

1.png

这个脚本使用了两个不同的IFS值来解析数据。第一个IFS值解析出/etc/passwd文件中的单独
的行。内部for循环接着将IFS的值修改为冒号,允许你从/etc/passwd的行中解析出单独的值。

处理用户输入

$0 表示程序名本身

在第9个变量之后,你必须在变量数字周围加上花括号,比如/${10}

解决变量$0不显示就会使用整个路径。

#!/bin/bash
name=$(basename $0)
echo The script name is:$name
echo This is $0                

$# 参数统计

判断命令行上有多少参数
echo there were $#

抓取所有的数据

$*  将这些参数视为一个整体
$@   参数当作同一字符串中的多个独立的单词

#!/bin/bash
count=1 
for param in "$*"
do
  echo "\$* is #$count=$param"
  count=$[ $count + 1 ]
done

for param in "$@"
do
  echo "\$@ is #$count=$param"
  count=$[ $count + 1 ]
done

${!#}

没有任何参数时, $#的值为0,
${!#}变量会返回命令行用到的脚本名
带参数时,显示数量相当于 !#

#!/bin/bash
num=$#
echo The num is $num
echo The "!#" is ${!#}

带参数时,显示数量
没带参数时,显示脚本名

$$ $?

显示当前进程
上个命令的退出状态

函数

创建函数

有两种格式

function name {
commands
}


name() {
commands
}
name函数的唯一名称,若定义名字一样则后续会替换第一个
commands函数中出现的顺序依次执行
注:
name 和 { 要有空格,否则出错

#!/bin/bash 
function wu {
 echo  "This my first function"
}

count=1
while [ $count -le 3 ]
do
  wu
  count=$[ $count + 1 ]
done
wu

function wu {
  echo $[ $1 * $2 ]
}

if [ $# -eq 2 ];then
  value=$(wu $1 $2)
  echo "The result is $value"
else
 echo "uage:file a b"
fi

前面的$1h和$2和脚本主体中的$1和$2变量并不相同
要在函数中使用这些值,必须在调用函数时手动将它们传过去。

return

函数的退出状态码是函数中最后一条命令返回的退出状态码:$?
但是无法知道其他命令中是否成功运行
return命令来退出函数并返回特定的退出状态码(整数值0~255,大于则会出错)

function wu {
read -p "Enter a value: " value
return $[ $value * 2 ]
}
注意:
函数一结束就取返回值
退出状态码必须是0~255

break

退出函数并返回特定的退出状态码
跳出循环体,该循环体已结束

contiune

中断循环中的迭代,若有指定的条件则继续循环下一个迭代
循环没有结束

局部变量

函数内部使用的任何变量都可以被声明成局部变量
局部变量:在变量声明的前面加上local关键

function wu {
 local temp=$[ $value + 5 ]
 result=$[ $temp * 2 ]
}
temp=4
value=6

wu
echo "The result is $result"
if [ $temp -gt $value ];then
echo "temp is larger"
else
echo "temp is smaller"
fi

数组

如果你试图将该数组变量作为函数参数,函数只会取数组变量的第一个值。
将该数组变量的值分解成单个的值,然后将这些值作为函数参数使用。
在函数内部,可以将所有的参数重新组合成一个新的变量。

#!/bin/bash
function testit {[图片上传中...(5.png-438497-1538820881421-0)]

local newarray=`echo "$@"`
echo "The new array value is: ${newarray[*]}"
}
myarray=(1 2 3 4 5)
echo "The original array is ${myarray[*]}"
testit ${myarray[*]}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值