《linux命令行与脚本编程大全》笔记一

297 阅读6分钟

在开发过程中发现自己对shell命令行不是特别熟悉,于是开始通读《linux命令行与脚本编程大全》,在此记录下自己的读书笔记

1、在linux中~ 和 /etc 的区别是什么

其中~:代表当前用户的主目录,例如在命令行中输入 cd ~ 将进入当前用户的主目录。~ 是一个快捷方式,可以使用户更快地访问主目录,而不必记住完整的路径名。

/etc:代表系统全局的配置文件目录,其中包含了许多系统和应用程序的配置文件和设置。例如,/etc/passwd 文件存储了系统中所有用户的账户信息,/etc/fstab 文件定义了系统启动时需要挂载的文件系统信息等等。

如何在vim中快速移动

  • 使用h j k l  四个键可以实现,向左,向下,向上,向右
  • 使用 gg 到文件开头;使用 G 到文件结尾

如何在vim中实现查找

假如需要查找,在命令模式(无法修改时)下按 / 并输入字符,然后enter键;继续看下一个 按n即可

centeros和ubuntu的区别

都是属于linux发行版的一种,基本没啥别的区别

在shell中如何将命令行的输出存入变量中?

方法有两种:

方法1使用反引号:例如   test=date; echo test

方法2 使用$(),  例如: test=$(date); echo test

最后输出的都是今天 的日期

注意: 假如在$() 中使用到变量,需要用双引号引起来,比如

test1=xxx

test=$(date “$test1"); echo test

对于输出重定向>  和>> 的区别

重定向会将前面命令的输出放入后面文件中,> 命令会将后面文件中已有的内容覆盖掉;

>>命令会在后面已有文件内容后面增加新的内容

比如 : command > log.js

与输出重定向对应,有输入重定向 <  和 <<

Command <  log

假如使用< 则右侧是文件;

但是还有一个场景就是数据是在控制台输入的,因此这个时候使用<< ,此时右侧是一个标识符,这个

标识符表示数据输入结束,当输入到这个标识符的时候,命令开始执行

输出重定向是将输出保存到文件中,管道是将一个命令的输出传递个下一个命令

commandA | commandB

管道最常见的用法之一是将命令产生的大量输出传送给more命令

比如:  ls -a | sort | more

more命令可以实现一屏显示,按 enter键继续显示

如何在bash shell中执行数学运算

可以使用 $[a + b -c]  来实现

test1=$[100 * 5 - 30]; echo test1

对于整数计算,也可以使用expr

test=$(expr 2 \* 5); echo test

但是上述两种写法都不支持浮点数运算

假如需要用到浮点运算,直接使用 bc

用法如下


var2=25

var3=$(echo "scale=2; $var1/$var2" | bc)

echo the answer is $var3 

其中: scale定义计算结果中的保留位数

一般默认的退出状态码是0, 可以在脚本执行完毕后,echo $?  来看到

也可以通过在脚本末尾自定义最后的退出状态码

比如 exit 5

退出状态码在0-255之间

shell中if语句的使用

if command1

then

     command2

fi

假如command1的返回状态码为0,则走then,执行command2

假如if语句中需要加上else

if command1

then

   Command2

else

    command3
fi

可以使用elif,例子如下

If command1

then

    command2

elif  command3

then

    command4

Fi

可以使用test来校验是否退出码为0

可以用 [ xx eq xx2] 实现数值对比

image.png

If [ $value eq 1 ]
then
   Command1
fi

字符串比较

image.png

如何简单判断字符串为空

可以使用 -n 和 -z (-n为当字符串长度不为0时为true, -z为字符串长度为0时为true)

image.png

注意,对于判断是否为空字符串,使用 -n时,后面需要用双引号括好,这样"test" 表示将 test" 表示将 test 变量的值作为一个整体来处理,即使 $1 中包含空格等特殊字符也不会被解析为多个参数;

 if [ -n $test ] 则表示将 test 变量的值作为一个参数传递给 [ 命令。如果 test 变量的值作为一个参数传递给 `[ `命令。如果 1 变量的值为空,则实际执行的命令为 if [ -n ],这个命令会报错并执行 if 语句中的错误处理代码块。

如何判断文件

image.png

image.png

用 -d 监测该目录是否存在

image.png

复合条件,可以使用[   ] && [    ]  或者 [    ]  ||  [    ]

20、在if语句中可以使用单括号(), 用于创建子shell并在子shell中执行commands;

可以使用双括号 (()), 双括号可以使用任意的赋值和比较表达式

image.png

可以在if中使用双括号,[[  ]],  可以使用正则表达式

21、看下下面的shell脚本

image.png

将if后面的表达式放在() 中,会开一个子shell来执行;

&> /dev/null 会将前面命令的错误和正常结果都放入一个地方,这个地方有去无回

22、如何使用case

image.png

23、使用for命令,循环执行commands

for  test  in  a b c d e
do
echo this is $test
done

24、对于单词本身存在空格的情况

image.png

需要用双引号将单词引起来,这样双引号中的字符会被认为是一个单词

25、循环读取文件中的值

image.png 直接使用 $(cat xx.txt) 即可

26、假如我现在需要循环输出文件中的内容,内容基于换行符分割

image.png

其中 IFS=$‘\n’ ,是更改IFS这个环境变量, IFS(Internal Field Separator)是一个环境变量,用于指定 shell 解释器在进行字段分离时使用的分隔符

如果没有 $ 符号,即使用 IFS='\n' 命令将 IFS 的值设置为换行符,那么实际上 IFS 的值将会包含两个字符,即反斜线 \ 和字母 n,而不是一个换行符

27、使用文件通配符来遍历文件

image.png

28、仿照c语言的for循环

image.png

也可以使用多种变量

image.png

29、使用while命令

image.png

30、until命令:与while命令工作的方式完全相反,until命令要求指定一个返回非0退出状态码的测试命令。只要测试命令的退出状态码不为0,bash shell就会执行循环中列出的命令。一旦测试命令返回了退出状态码0,循环就结束了

image.png

31、使用嵌套循环

image.png

32、使用IFS=\n’和IFS=’\n’ 和 IFS=”\n”这两种写法是不一样的

前面一种是将字符串扩展成换行符(换行符为特殊字符); 后面一种是将字符串设置为包含换行符的字符串 其中 $ 的含义是扩展

33、可以使用break和continue来结束整个循环或者当前循环,使用方式和js中一致

34、如何将for循环输出结果重定向至文件中

image.png

35、在bash shell中,$PATH 是一个环境变量,用于指定系统在搜索可执行文件时要查找的路径列表。

其定义分为两部分,一部分是在/etc/profile:这个文件是系统级别的启动文件,它在系统启动时被读取;另一部分是在~/.bashrc 中,这是用户级别的启动文件,可以增加变量path

36、如何打印所有的可执行文件

image.png

需要注意几个点:

  • 1、for语句中必须要done结尾
  • 2、假如对于简单字符串,IFS不需要$开头
  • 3、可以用 for file in $fold/*  读取文件夹下的所有文件

37、为什么我直接运行./test.sh无法运行,必须要 sh ./test.sh 才能运行呢

因为test.sh不是可执行文件,需要使用 chmod +x ./test.sh 将其变成可执行文件即可使用./test.sh来运行

38、在shell中传参,假如小于9个,可以直接使用 1或者1 或者 9 按照顺序来获取传参;

假如大于9,则使用 10来进行传参;可以使用位置变量{10} 来进行传参; 可以使用位置变量0获取在命令行中运行的shell脚本名

image.png

39、可以使用 $# 这个变量获取执行脚本的参数个数

image.png

40、使用 $* 可以获取到所有的参数,shell会将所有参数变成一个参数,即for的时候,只会有一条数据;

$@也可以获取到所有的参数,但是使用for时,会按照参数的顺序进行循环

41、如何获取用户的输入?

image.png

  • 使用read命令,会将键盘的输入存入name变量中;

  • echo -n 会将输出文案末尾默认的换行符干掉

image.png

read也可以直接指定提示符,使用 -p即可

42、可以使用-t 实现定时,假如超过时间没有输入,会返回非零状态码

image.png

-t的默认时间是按照秒 计算

43、使用-s可以使输入的信息不展示

image.png

44、使用read遍历文件,逐行遍历

image.png

45、shell中存在三种文件描述符

image.png

46、一般情况我们使用 > 是只会重定向普通输出,但是假如想要重定向错误,需要使用 2>

image.png

但同时,我既想重定向普通输出,又想重定向错误

image.png

需要将普通输出和错误分开放置;使用&>可以将普通输出和错误都重定向至一个文件中

image.png

47、临时重定向: 假如有意在脚本中生成错误信息,可以将单独的一行输出重定向到STDERR

在某个shell文件中

image.png

image.png

可以将错误重定向到 test9文件中

48、永久重定向:对于某个文件的输出,更改其标准输出或者错误输出地址, 使用exec 1 或者 exec 2

image.png