Shell基础

这篇博客介绍了Linux shell脚本中的关键元素,包括awk命令用于文本处理,sed用于文件内容替换,以及各种循环(while、for、until)和条件判断(if、case)。此外,还讲解了shell变量、函数、IO重定向及常用的环境变量,如$PATH、$USER。文章深入浅出地展示了shell脚本编程的基础知识。
摘要由CSDN通过智能技术生成

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 : 查看所有已定义的变量
          exportenvdeclare -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命令

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值