20220224:
- $( ) 和 `都是替换文件
- awk
awk是文本文件处理语言。
Print the lines which match the given pattern.
awk '/manager/ {print}' employee.txt
Output:
ajay manager account 45000
varun manager sales 50000
amit manager account 47000
每行按空格或TAB分割,输出文本中的1、4项
awk '{print $1,$4}' log.txt
- sed
处理文本文件,如在test.txt文本文件中将jack替换为amy:
sed 's/jack/amy' test.txt
删除test.txt中的第七行:
sed '7d' test.txt
Shell是宏处理器或命令行解释器,主要用于翻译命令行中的命令,让其能让系统执行。也可以通过调用shell脚本来自动运行程序。
Bash is the shell, or command language interpreter, for the GNU operating system.
查看可用shell: cat /etc/shells
查看默认shell: echo $SHELL
常见的shell:
Bourne Shell(/usr/bin/sh或/bin/sh)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
决定用哪个解释起来执行shell: #!/bin/bash
变量:
可以包含大小写字母,数字和下划线。 必须字母和下划线打头。
通过变量前加$来访问变量的值,如:
#!/bin/sh
NAME="Zara Ali"
echo $NAME
只读变量:
#!/bin/sh
NAME="Zara Ali"
readonly NAME
NAME="Qadiri"
(/bin/sh: NAME: This variable is read only.)
Unsettle a defined variable ???
变量的类型: Local Variables , Environment variables, shell variables.???
用local命令声明局部变量
( )
:子shell的命令组
$(cmd)
执行cmd的结果
{ }
:当前shell的命令组
另一种{ }
:
量的原形:${var},即是加一个大括号来限定变量名称的范围
[[ ]]、**[ ]**都是用来测试的,[[]]是关键字,里面可以用&&、||、<、>等类似C语言的语法;[ ]是bash内嵌的命令,也是用于测试的。[[ ]]通用性更好些。
[ ] : bash 的内部命令!与 test 命令是等同的!
(( )),类似let,用于计算表达式。()可以把多个命令括起来,在一个子shell运行。
let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。
数组:
an array variable and a scalar variable???
访问所有成员的方法 :
${array_name[*]}
${array_name[@]}
创建数组:
ksh shell方法:
set -A array_name value1 value2 ... valuen
bash shell方法:
array_name=(value1 ... valuen)
操作符:
Arithmetic Operators
Relational Operators
Boolean Operators
! 非运算,
-o 或运算,
-a 与运算。
String Operators
= 检测两个字符串是否相等
!= 检测两个字符串是否不相等
-z 检测字符串长度是否为0
-n 检测字符串长度是否不为 0
$ 检测字符串是否不为空,不为空返回 true。
File Test Operators
-d file 检测文件是否是目录
-r file 检测文件是否可读
-w file 检测文件是否可写
-x file 检测文件是否可执行
-e file 检测文件(包括目录)是否存在
-c file 检测文件是否是字符设备文件
例外:Bourne shell没有算数操作符,用awk和expr来运算,数字之间必须有空格,表达式必须用’'包起来。
#!/bin/sh
val=`expr 2 + 2`
echo "Total value : $val"(Total value : 4)
Bash shell: $((EXPRESSION))
#!/bin/sh
a=10
b=20
echo $((a + b))
shell中测试命令的比较不是使用简单的> = <等,而是用扩展符,如下所示:
-eq //equal 等于
-ne //no equal 不等于
-gt //great than 大于
-lt // low than 小于
ge // great and equal 大于等于,注意没有"-"
le //low and equal 小于等于,注意没有“-”
循环:可以重复执行一连串代码。
https://www.runoob.com/linux/linux-shell-process-control.html
The while loop
The for loop
The until loop
The select loop
循环控制:break 和 continue
break命令允许跳出所有循环(终止执行后面的所有循环)。
continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环的迭代。
for循环:
for var in item1 item2 ... itemN; do command1; command2… done;
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
通常情况下 shell 变量调用需要加 $,但是 for 的 (()) 中不需要,下面来看一个例子:
#!/bin/bash
for((i=1;i<=5;i++));do
echo "这是第 $i 次调用";
done;
while循环:
while condition
do
command
done
#!/bin/bash
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
until循环:
until condition
do
command
done
#!/bin/bash
counter=0
until [ $counter -gt 5 ]
do
echo Counter: $counter
((counter++))
done
if循环:
if condition
then
command1
command2
...
commandN
fi
num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
echo '两个数字相等!'
else
echo '两个数字不相等!'
fi
case循环:
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
**Shell Substitutions:**加一个-e
#!/bin/sh
a=10
echo -e “Value of a is $a \n”
\b 空格
\\ \
\n 换行
\v 垂直换行
**IO重定向:**
Shell函数:
第一种
```bash
fn() {
# codes
}
第二种
function fn() {
# codes
}
Bash学习:
运行bash脚本有两种方法:
1.作为可执行程序:
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
2.作为解释器参数:
/bin/sh test.sh
/bin/php test.php
两数相加:
#!/bin/bash
val=`expr 2 + 2`
echo "两数之和为 : $val"
文件测试运算符:
https://www.runoob.com/linux/linux-shell-basic-operators.html
“ ? ” 标 记 的 用 途 是 什 么 在 i f 条 件 中 使 用 “ ?” 标记的用途是什么 在 if 条件中使用 “ ?”标记的用途是什么在if条件中使用“?” 可以来检查前一命令的结束状态。如果结束状态不是 0,说明命令执行失败。
Bash面试:
列举几个 环境变量,并且 说出他们的作用:
$PATH : 命令路径
$Shell: 当前 shell 类型
$SHLVL : 当前 shell 嵌套层次!(就是有几个shell进程)
$USER: 当前用户
$HOME : 当前用户的家目录
$? : 查看上一条命令是否执行成功(0为成功,非0为失败)
$HISTSIZE : 历史命令条数
$LANG : 当前系统语言
$PS1 : 登录系统时候的提示符!
关于 变量 的命令:
赋值: 1、局部变量赋值: varname=值;
2、全局变量赋值: export varname=值 或 declare x varname=值
3、只读变量赋值: readonly varname=值 或 declare i varname=值
查看变量: set : 查看所有已定义的变量
export 或 env 或 declare -x 查看 所有环境变量!
readonly -p 查看只读变量!
删除变量: unset varname 删除变量!
只读变量无法删除,重启消失!
求 10 + 10 的和:
方法1:
root@zhengzelin:~# a=10;b=10
root@zhengzelin:~# let c=a+b
root@zhengzelin:~# echo $c
20
方法2:
root@zhengzelin:~# a=10;b=10
root@zhengzelin:~# c=$(expr $a + $b )
root@zhengzelin:~# echo $c
20
’ 和 " 的区别:
root@zhengzelin:~# a=10
root@zhengzelin:~# echo "$a"
10
root@zhengzelin:~# echo '$a'
$a
'' 相当于转义, "" 将变量变成它的值
写脚本篇:
①、输出 1 -100 所有数、奇数、偶数,并且求和:
输出 1 -100 中的所有数:
输出1 - 100:
使用 for :
for i in $(seq 1 100);do echo $i;done
for((i=1;i<=100;i++));do echo $i;done
使用 while :
a=1;while [ $a -le 100 ];do echo $a;let a++;done
a=1;while true;do echo $a;let a++;if [[ $a -gt 100 ]];then break;fi;done
a=1;while :;do echo $a;let a++;if [[ $a -gt 100 ]];then break;fi;done
true 和 : 都是内部命令,执行都为true,你可以使用 type true 来查看命令类型,然后执行 true | echo $?
使用 until :
a=1;until [ $a -gt 100 ];do echo $a;let a++;done:
1
2
3
4
。。。。
输出 1 - 100 中的 奇偶数:
for 列表格式:
奇数:
for 列表格式:
奇数:for i in `seq 1 100`;do let a=$i%2;if [[ $a -eq 0 ]];then continue;fi;echo $i;done
偶数:for i in `seq 1 100`;do let a=$i%2;if [[ $a -eq 1 ]];then continue;fi;echo $i;done
解释: 当 i = 3 的时候,a=3%2, a=1,这为奇数,当 1 = 1 时(if条件判断句) 跳出此次循环(不输出奇数),所以就为 打印 偶数!
②、打印 正三角、倒三角:
root@zhengzelin:~# for((i=1;i<=5;i++));do for((a=1;a<=$i;a++));do echo -n "*";done;echo;done
*
**
***
****
*****
root@zhengzelin:~# for((i=5;i>=1;i--));do for((a=$i;a>=1;a--));do echo -n "*";done;echo;done
*****
****
***
**
*
如何获取一个文件每一行的第三个元素 ?
awk'{print $3}'
假如文件中每行第一个元素是FIND,如何获取第二个元素
awk'{ if ($1 == "FIND") print$2}'
awk用法:
每行按空格或TAB分割,输出文本中的1、4项
log.txt文本内容如下:
2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo
$ awk '{print $1,$4}' log.txt
---------------------------------------------
2 a
3 like
This's
10 orange,apple,mongo
如何向连接两个字符串 ?
V1="Hello"
V2="World"
V3=${V1}${V2}
echo $V3
bash 中 $! 表示什么意思 ?
后台最近执行命令的 PID.
如何输出当前 shell 的 PID ?
echo $$
如何获取文件的最后一行 ?
tail -1
如何获取文件的第一行 ?
head -1
man + bash命令