在开发过程中发现自己对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] 实现数值对比
If [ $value eq 1 ]
then
Command1
fi
字符串比较
如何简单判断字符串为空
可以使用 -n 和 -z (-n为当字符串长度不为0时为true, -z为字符串长度为0时为true)
注意,对于判断是否为空字符串,使用 -n时,后面需要用双引号括好,这样"test 变量的值作为一个整体来处理,即使 $1 中包含空格等特殊字符也不会被解析为多个参数;
而 if [ -n $test ] 则表示将 1 变量的值为空,则实际执行的命令为 if [ -n ],这个命令会报错并执行 if 语句中的错误处理代码块。
如何判断文件
用 -d 监测该目录是否存在
复合条件,可以使用[ ] && [ ] 或者 [ ] || [ ]
20、在if语句中可以使用单括号(), 用于创建子shell并在子shell中执行commands;
可以使用双括号 (()), 双括号可以使用任意的赋值和比较表达式
可以在if中使用双括号,[[ ]], 可以使用正则表达式
21、看下下面的shell脚本
将if后面的表达式放在() 中,会开一个子shell来执行;
&> /dev/null 会将前面命令的错误和正常结果都放入一个地方,这个地方有去无回
22、如何使用case
23、使用for命令,循环执行commands
for test in a b c d e
do
echo this is $test
done
24、对于单词本身存在空格的情况
需要用双引号将单词引起来,这样双引号中的字符会被认为是一个单词
25、循环读取文件中的值
直接使用
$(cat xx.txt) 即可
26、假如我现在需要循环输出文件中的内容,内容基于换行符分割
其中 IFS=$‘\n’ ,是更改IFS这个环境变量, IFS(Internal Field Separator)是一个环境变量,用于指定 shell 解释器在进行字段分离时使用的分隔符
如果没有 $ 符号,即使用 IFS='\n' 命令将 IFS 的值设置为换行符,那么实际上 IFS 的值将会包含两个字符,即反斜线 \ 和字母 n,而不是一个换行符
27、使用文件通配符来遍历文件
28、仿照c语言的for循环
也可以使用多种变量
29、使用while命令
30、until命令:与while命令工作的方式完全相反,until命令要求指定一个返回非0退出状态码的测试命令。只要测试命令的退出状态码不为0,bash shell就会执行循环中列出的命令。一旦测试命令返回了退出状态码0,循环就结束了
31、使用嵌套循环
32、使用IFS=”\n”这两种写法是不一样的
前面一种是将字符串扩展成换行符(换行符为特殊字符); 后面一种是将字符串设置为包含换行符的字符串 其中 $ 的含义是扩展
33、可以使用break和continue来结束整个循环或者当前循环,使用方式和js中一致
34、如何将for循环输出结果重定向至文件中
35、在bash shell中,$PATH 是一个环境变量,用于指定系统在搜索可执行文件时要查找的路径列表。
其定义分为两部分,一部分是在/etc/profile:这个文件是系统级别的启动文件,它在系统启动时被读取;另一部分是在~/.bashrc 中,这是用户级别的启动文件,可以增加变量path
36、如何打印所有的可执行文件
需要注意几个点:
- 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个,可以直接使用 9 按照顺序来获取传参;
假如大于9,则使用 0获取在命令行中运行的shell脚本名
39、可以使用 $# 这个变量获取执行脚本的参数个数
40、使用 $* 可以获取到所有的参数,shell会将所有参数变成一个参数,即for的时候,只会有一条数据;
$@也可以获取到所有的参数,但是使用for时,会按照参数的顺序进行循环
41、如何获取用户的输入?
-
使用read命令,会将键盘的输入存入name变量中;
-
echo -n会将输出文案末尾默认的换行符干掉
read也可以直接指定提示符,使用 -p即可
42、可以使用-t 实现定时,假如超过时间没有输入,会返回非零状态码
-t的默认时间是按照秒 计算
43、使用-s可以使输入的信息不展示
44、使用read遍历文件,逐行遍历
45、shell中存在三种文件描述符
46、一般情况我们使用 > 是只会重定向普通输出,但是假如想要重定向错误,需要使用 2>
但同时,我既想重定向普通输出,又想重定向错误
需要将普通输出和错误分开放置;使用&>可以将普通输出和错误都重定向至一个文件中
47、临时重定向: 假如有意在脚本中生成错误信息,可以将单独的一行输出重定向到STDERR
在某个shell文件中
可以将错误重定向到 test9文件中