Skip to content

Latest commit

 

History

History
268 lines (176 loc) · 5.82 KB

File metadata and controls

268 lines (176 loc) · 5.82 KB

十五、答案

第一章

  1. 错误在第二行:变量声明中不应该有空格。
#!/bin/bash 
var1="Welcome to bash scripting ..." 
echo $var1 
  1. 结果将是Tuesday,因为数组是零基的。
  2. 这里有两个错误:第一个错误是变量声明中的空格,第二个错误是使用了单引号,而我们应该使用反引号。

解决方案:

#!/bin/bash files='ls -la' echo $files
  1. 变量b的值为c,变量c的值为a

因为我们没有在赋值行中使用美元符号,所以变量将采用字符值而不是整数值。

第二章

  1. 三个

这是因为整个 bash 主要是一个注释,所以有三行注释。

  1. 选项-b与其值之间没有空格,因此它将被视为一个选项。
-a
-b50
-c
  1. 1

四个

这是因为我们有 5 个传递的参数,并且我们使用 shift 来删除一个参数。

  1. 2

-n

这是因为它位于左侧,而shift命令从左侧删除参数。

第三章

  1. False

由于小写字符具有较高的 ASCII 顺序,语句将返回False

  1. 两者都是正确的,并将返回相同的结果,即Strings不相同。
  2. Three

我们可以使用以下方法:

  • :大于等于
  • -gt:大于
  • :不等于
  1. 真正的

因为一个测试足以返回 true,所以我们可以确定第二个测试将返回 true。

第四章

  1. 我们可以进行以下更改:
"Hello message": {
    "prefix": "hello",
    "body": [
      "echo 'Hello ${1|first,second,third|}' "
    ],
    "description": "Hello message"
  }
  1. source命令。

第五章

  1. 使用((:
#!/bin/bash
num=$(( 25 - 8 ))
echo $num
  1. 问题在于文件名中的空格。 要修复它,把文件名放在引号之间:
$ rm "my file"
  1. 括号前没有美元符号:
#!/bin/bash
a=$(( 8 + 4 ))
echo $a

第六章

  1. 没有行。 因为循环输出被重定向到一个文件,所以屏幕上不会显示任何内容。

  2. 四。 循环将从8开始,一直持续到12,它将匹配大于或等于的条件,并中断循环。

  3. 问题在于for循环定义中的逗号。 它应该是分号。 所以正确的脚本应该如下所示:

#!/bin/bash 
for (( v=1; v <= 10; v++ )) 
do 
echo "value is $v" 
done 
  1. 由于递减语句在循环之外,count 变量将是相同的值,即10。 这是一个无限循环,它将永远打印10,要停止它,你需要按Ctrl+C

第七章

  1. 由于我们使用的是$1变量而不是$@,因此函数将只返回第一个元素。
  2. 50 是的,它是一个全局变量,但因为我们在函数调用之前打印了值,所以变量不受影响。
  3. 缺少括号()或在函数名前添加关键字 function。 应该这样写:
clean_file() { 
    is_file "$1" 
    BEFORE=$(wc -l "$1") 
    echo "The file $1 starts with $BEFORE" 
    sed -i.bak '/^\s*#/d;/^$/d' "$1" 
    AFTER=$(wc -l "$1") 
    echo "The file $1 is now $AFTER" 
} 
  1. 问题在于函数调用。 在函数调用期间不应该使用括号()。 括号只能在函数定义中使用。 正确的代码应该是这样的:
#!/bin/bash 
myfunc() { 
arr=$@ 
echo "The array from inside the function: ${arr[*]}" 
}
test_arr=(1 2 3) 
echo "The origianl array is: ${test_arr[*]}" 
myfunc ${test_arr[*]} 

第八章

  1. 一个也没有。 因为您正在用一个不存在的大写字母搜索 Sed
  2. 一个也没有。 删除命令d只删除流中的行,不删除文件。 要从文件中删除,可以使用-i选项。
  3. 第四行。 因为我们使用了追加命令 a,所以它将被插入到指定的位置之后。
  4. 没有,因为w标志只与替代命令s一起使用。

第九章

  1. 可以使用以下命令打印第 50 行:
$ sed -n '50 p ' /etc/httpd/conf/httpd.conf  
  1. Apache 默认端口80可以修改为8080:
$ sed -i '0,/Listen [0-9]*/s//Listen 8080/' /etc/httpd/conf/httpd.conf  

我们搜索Listen,其中定义了 Apache 默认端口,搜索它旁边的数字,并将其更改为Listen 8080

第十章

  1. 没有什么

你应该使用没有美元符号的变量名来打印它。

  1. 解决方案:0

因为您应该打印$1而不是$2,其中$1是第一个字段。

  1. while循环的迭代值应该小于4而不是3
  2. 1

因为 UID 小于1的唯一用户是 root(UID=0),所以将打印一行。

第十一章

  1. 0 行

因为单词awesome后面有一个句号,如果您想打印该行,可以使用以下命令:

$ awk '/awesome\.$/{print $0}' myfile 
  1. 两条线

因为我们搜索包含单词scripting的行。 如果句点后面跟着任何文本,则该模式只存在于两行中,因为第三行在单词后面不包含句点。

  1. 三行

因为我们使用了问号,这意味着字符类不是模式匹配的必须对象。

  1. 没有什么

由于我们使用了管道符号,这是一个 ERE 字符,并且由于我们使用 sed,我们必须使用 sed 的-r选项来打开扩展引擎。

第十二章

  1. 字段 1
  2. 您可以使用print NR或通过管道将输出输出到wc -l

我们必须使用-l,否则它将计算单词。

$ awk '{print $1}' access.log | sort | uniq -c
$ awk '{print $7}' access.log | grep 'php' | sort | uniq -c | sort -nr | head -n 1 

你应该使用标题-n 1来获得只有一页的内容。

第十三章

  1. 使用lastlog命令
$ lastlog | awk ' /Never logged/ { print $1}'
  1. 使用wc命令
$ lastlog | awk ' /Never logged/ { print $1}' | wc -l
  1. 零。 因为这一行以两个星号结尾。

第 14 章

  1. 8
  2. 因为我们正在使用sys模块,所以应该首先导入它。

所以正确的代码应该是这样的:

#!/usr/bin/python3
import sys
print( len(sys.argv))
  1. 2