shell基础
shell是命令解释器(command interpreter),是操作系统的用户接口。
输入/输出重定向
-
输出重定向追加:
command[参数]>>文件名
command[选项] 2>错误文件名
command[选项] 2>>错误文件名
eg.ls /dev/std*
输出中的stdin是输入键盘,staout是显示器,
-
管道
(1)shell使用管道将一个命令的输出直接作为另一个命令的输入
(2)通过使用管道符号“|”来建立一个管道:
command_a [参数] | command_b [参数]
eg.ls dir
(将ls输出的单词作为下一个命令的输入)
ls dir|wc -w
(读出有多少个用空格隔开的单词)
-
特殊字符
(1)通配符 用于模式匹配,如文件名匹配,路径名搜索,字符串查找等。包括*,?和括在方括号[]中的字符序列。
(2)引号
-
单引号:由单引号括起来的字符都作为普通字符出现,特殊字符被单括号括起来之后也会失去原有的意义,只作为普通字符来解释。
-
双引号:由双引号括起来的字符,除$,\,'和"这几个字符仍是特殊字符保留其特殊功能外,其余字符作为普通字符对待。
-
反引号“()”:其括起来的字符会被shell解释为命令,shell会优先执行该命令,然后将得到的字符替换掉反引号中原有的命令。
-
别名 命令别名通常是其他命令的缩写,用来减少键盘输入,命令格式为: alias alias-name = 'original-command'
shell脚本
-
什么是shell脚本? 是使用shell脚本命令编写的文件,也称为shell script. 与结构化程序不同,shell不需要编译成目标程序,也不需要链接成可执行的目标码。
-
shell脚本执行方式:
1.为脚本文件加上可执行权限,切换到shell脚本所在的目录执行它; (添加权限的方法:chmod + x hello.sh)
2.以绝对路径的方式去执行bash shell脚本(可以在当前目录下执行,也可以不在当前目录下执行);
3.sh shell脚本名(在工作目录下/root/bin);
4.在当前shell环境中执行用. hello.sh或source hello.sh来执行bash shell脚本。
总结:前三种方法执行shell脚本时都是在当前shell(称为父shell)开启一个子shell环境,此shell脚本就在这个子shell环境中执行,shell脚本执行完后子shell环境随即关闭,然后又回到父shell中。而方法四则是在当前shell中执行的。
shell变量
-
在shell脚本中也可以使用变量,一个变量就是内存中被命名的一块存储空间
-
用户自定义变量
1.Variable-name=value
注意:如果字符串里面包含空格,就必须用括号把他们括起来,注意在等号两边不能有空格。
2.清除变量 unset variavle-name
-
环境变量 保存和系统操作环境相关的数据。$HOME,$PWD,$SHELL,$USER等等。
-
位置变量
-
如果脚本程序在执行时带有参数,就会创建一些额外的变量,这些额外的变量和变量所在命令行位置有关。
-
当命令行上的命令参数超过9个时,shell提供了shift命令将全部的命令参数都左移一位
shell编程基础
shell脚本的输入/输出
-
使用read命令可以将用户的输入赋值给一个变量
-
echo默认情况下是换行标准输出语句,echo输出多个空格时必须用括号括起来
eg.echo "please input:"
输出为:please input:
-
export命令: 可将shell脚本中定义的变量导出到子shell中,并使之在子shell中有效。
eg.定义两个变量:var1=hello,var2=world 写一个脚本,包括命令echo "var1"和echo "var2" 运行脚本,无输出使用
shell的逻辑运算
-
条件测试(有两种测试命令)
1.test 条件表达式
2.[条件表达式]
注:使用第二种方式进行条件测试时,必须在[]前后保留空格,否则shell会提示出错。
三种测试类型:
1.字符串比较:
①string1 = string2 如果两个字符串相同结果为真
②string1 != string2 如果两个字符串不相同结果为真
③-n string 如果字符串不为空则为真
④-z string 如果字符串为空(一个空串)则为真
注:”=“前后都有空格
2.算数比较
①expression1 -eq expression2 如果两个表达式相等则结果为真
②1 -ne 2 不等则为真
③1 -gt 2 1大于2则结果为真
④1 -ge 2 1大于或者等于2则结果为真
⑤1 -lt 2 1小于2则结果为真
⑥1 -le 2 1小于或者等于2则结果为真
3.文件条件测试
①-d file 如果文件是一个目录则结果为真
②-e file 如果文件存在则结果为真 ③-f ④-g ⑤-r ⑥-s ⑦-u ⑧-w ⑨-x
-
OR运算
它用于在条件测试中结合多个条件,并且只要其中一个条件为真(true),整个表达式就为真。
#!/bin/bash
value=10
# 使用逻辑 OR 运算测试两个条件
if [ $value -eq 5 ] || [ $value -eq 10 ]; then
echo "value 等于 5 或 10"
else
echo "value 不等于 5 且不等于 10"
fi
在这个示例中,如果 $value
的值等于 5 或 10 中的任何一个,条件测试将为真,因此将输出 "value 等于 5 或 10"。
shell控制结构
-
if 语句
提供条件测试,根据测试的条件结果执行相应的语句
基本语句:
if condition then statements else statements fi
另外一种格式:
if condition 1;then statements elif condition2;then statements else...
-
case语句
是一个多分支结构,用于测试一个变量与多个模式(pattern)之间的匹配情况,类似于switch语句,但是更灵活。语法格式如下:
case 变量 in 模式1) 命令1 ;; 模式2) 命令2 ;; *) 默认命令 ;; esac
eg.
case $number in 1)echo "Monday";; 2)echo "Tuesday";; 3)echo "Wendsday";; *)echo "你输入了其它数字";; esac
case支持合并匹配模式,即在每一个模式中,可以使用通配符或者逻辑符号。例如,使用问号(
?
)来匹配单个字符,使用星号(*
)来匹配任意数量的字符。eg.使用方括号"[]"来定义模式。
#!/bin/bash echo"请输入一个字符串:" read str case $str in [a-z]) echo"你输入了一个小写字母" ;; [A-Z]) echo"你输入了一个大写字母" ;; [0-9]) echo"你输入了一个数字" ;; ?) echo"你输入了一个单个字符" ;; *) echo"你输入了一个字符串" ;; esac
若一个分支要包含多条命令,则一条命令结束后直接回车换行,每一个分支用“;;”隔开。
-
for语句:可以用来循环处理一组值,这组值可以是任意字符串的集合。
#!/bin/bash for var in hello world 123 do echo $var done exit 0
通配符扩展(输出一个一个以空格隔开的字符串)
#!/bin/bash for file in $(ls ) do echo $file done exit 0
for循环中的参数值也可以从命令行中取得。
-
while循环
-n "please enter password:" read password while ["$password" != "123456"] do echo "sorry,try again" read password done exit 0
往f1文件里面添加数据:
echo "11 aa">f1
读文件中的数据
while read -r line//每次读取一行,文件数据读完就结束循环 do echo $line done <f1