shell的基本语法(持续弃坑)

最近什么都学不进,这种时候个人认为最好的办法就是强迫自己学习一门语言。反正不用什么脑子对吧

推荐vs code中的插件:shellman

比较

#!/bin/bash
echo input a:
read a
echo input b:
read b
[ $a -eq 1 ] && [ $b -eq 1 ] && {
    echo a = b = 1
}
[ $a -eq 1 ] || [ $b -eq 1 ] && {
    echo a = 1 or b = 1
}
[ $a -eq 1 ] || [ $b -eq 1 ] || {
    echo a != 1 and b != 1
}
[ $a -eq 1 ] && [ $b -eq 1 ] || {
    echo a != 1 or b != 1
}
  1. 前一个“&&”或是“||”代表and或者是or。
  2. 后面一个“&&”代表当前面的表达式为真时执行代码
  3. 后面一个“||”代表当前面的表达式为假时执行代码

拆分开来理解,前面是表达式,最后一个是判断用的

字串(单引号以及双引号)

拼接与python不同

单引号

  • 单引号中任何字符都会原样输出,单引号字符串中的变量时无效的
  • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用

双引号

  • 双引号里可以有变量
  • 双引号里可以出现转义字符
your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3
output:
hello, runoob ! hello, runoob !
hello, runoob ! hello, ${your_name} !

显示file.txt文件的第10行

file="file.txt"
line10=`sed -n '10p' $file`
echo $line10
file="file.txt"
line10=`cat $file | tail -n +10 | head -n 1`
echo $line10

使用cat和sed运行时间差不多,内存消耗少了0.3MB

题目有要求如果文件没有10行怎么错误处理

file="file.txt"
a=`wc -l $file`
line=${a% *}
if [ $line -ge 9 ]; then
    line10=`cat $file | tail -n +10 | head -n 1`
    echo $line10
fi

这里我也不是很弄清楚为什么10行的文件”wc -l”输出”9″,但是在用cat的时候行数指定却是10。讲道理这个第一行是0行还是1行不应该统一么

有效电话号码

给定一个包含电话号码列表(一行一个电话号码)的文本文件 file.txt,写一个 bash 脚本输出所有有效的电话号码。
你可以假设一个有效的电话号码必须满足以下两种格式: (xxx) xxx-xxxx 或 xxx-xxx-xxxx。(x 表示一个数字)
你也可以假设每行前后没有多余的空格字符。

root@kali:~/learning/sh# cat file.txt 
987-123-4567
123 456 7890
(123) 456-7890
0(001) 345-0000
(001) 345-00001
(001)-345-0000
111 444-3485
(002)456-2934
123) 456-1293
root@kali:~/learning/sh# cat 006.sh 
#!/bin/bash
grep "^\(([0-9]\{3\}) \)\{0,1\}[0-9]\{0,3\}-\{0,1\}[0-9]\{3\}-[0-9]\{4\}$" file.txt
root@kali:~/learning/sh# ./006.sh 
987-123-4567
(123) 456-7890

统计词频

写一个 bash 脚本以统计一个文本文件 words.txt 中每个单词出现的频率。
为了简单起见,你可以假设:
* words.txt只包括小写字母和 ' ' 。
* 每个单词只由小写字母组成。
* 单词间由一个或多个空格字符分隔。

cat words.txt | awk '{for(i=1;i<=NF;i++)print $i}' | sort | uniq -c | sort -r | awk '{print $2, $1}'

linux下真的好多神奇的命令,比如这个像C那样的awk,uniq -c 之前要sort,因为 如果重复的数据不连续,就会被认为时两个不同内容的行(这个也是查来的,不知道为什么)

起先输出的时候频率在左, 单词在右,搞来搞去发现uniq就是这么输出的,查了一下发现还是用awk方便,干脆直接输出反一下好了

参考:

2
说点什么

avatar
1 Comment threads
1 Thread replies
2 Followers
 
Most reacted comment
Hottest comment thread
2 Comment authors
danisjiang张琪灵 Recent comment authors

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  Subscribe  
最新 最旧 得票最多
提醒
张琪灵
游客

这时候应该刷刷题: http://xcoding.me 学习JS