在 AskUbuntu 上,我看到一些命令看起来相当复杂,里面有很多符号。为了更好地理解这些命令是如何构建的,我想知道这些符号代表什么。
例如:
find ~/ -name \*.c -exec sed -i "s/cybernetnews/cybernet/g" {} \;
或者更复杂一点:
echo -e "\e[${i#*=}m$( x=${i%=*}; [ "${!x}" ] && echo "${!x}" || echo "$x" )\e[m"
我非常清楚,添加诸如-c
、之类的参数--debug
会对主命令产生一定的影响。这些参数的含义几乎在所有情况下都可以在页面中找到man
,所以这不是我真正想要的。
请尝试在您的答案中定义这些符号的具体作用,而不是解释我给出的示例。可能看起来像这样:
" means 'argument': the main command uses anything within these symbols as its source
^ is used for ...
# is used for ...
提前致谢
答案1
看Bash 参考手册部分称为Shell 操作和高级 Bash 脚本指南 第 3 章(特殊字符)。
每当我需要学习有关 ubuntu/linux 中的 shell 脚本的新知识时,我都会参考这些内容。
我认为您会发现 ABS 第 3 章最容易理解。所有符号都显示在页面的最左侧,其下方紧接着有说明。
答案2
不幸的是,您必须转到手册页,因为“符号”可能具有不同的含义,具体取决于读取它们的命令。
例如,在您的第一个命令中,{} 和 \; 的含义取决于 find 命令 (man find)。sed 参数上的引号的含义取决于 sed 或 bash(因为它是一个带引号的参数,所以它可能是一个 shell 的东西)。~/ 肯定是一个 bash 模式扩展的东西。
对于第二个复杂的命令,它主要是回显内容,因此您可以在 bash 的手册页中找到有关它的大部分信息。
为了回答你对此的评论,重定向字符 > < | 用于将内容从文件传输到文件(大于号和小于号),并将命令的输出与另一个命令的输入连接起来(管道 |)。请参阅这里有关 I/O 重定向的精彩教程,这是 Unix shell 和工具集的一个非常强大的设计功能。
答案3
.c
第一个在目录中搜索以 结尾的文件~/
,然后exec
使用 utes sed
(流线型编辑器)进行搜索,seds
会将cybernetnews
其更改为cybernet
。
第二个我不明白...执行时显示的结果为空。
答案4
由于您粘贴的是复杂的命令,因此很难告诉您符号的完整含义。
尤其是回声。
请参阅 man echo 中的 -e ,它启用了转义符,因此稍后 \e 就是转义符。
其余符号大部分都是字符串操作。
假设你有一个变量 i,它包含一个字符串“foo”
i=foo;echo $i
foo
但是如果变量 $i 也是字符串的一部分,情况就会变得更加复杂
echo $ibar # Note: no output
echo ${i}bar # we have output
foobar
现在你也可以操作字符串,只打印一部分
在你的情况下
${i#*=} = 打印 $i,删除 * 和 = 之间的最短匹配,但 * 本身是通配符..
echo ${i#o}
foo
echo ${i#*o}
o
看http://tldp.org/LDP/abs/html/string-manipulation.html
接下来我们进入子 shell(x...)
Bash 将处理子 shell 中的命令并返回命令的输出。
x = (i 的子字符串) ;继续
现在我们有一个测试,[“${!x}”]
看 :http://tldp.org/LDP/abs/html/testconstructs.html
至此我就不能再告诉你更多了。
在 bash 中,${!x} 将是一个空字符串。&& == 逻辑且 || 是逻辑或
测试 {空字符串} AND 回显空字符串或回显 x
您需要提供更多语法,但看起来这个回声正在将其输出传输到某处。
再次[ ]是一个测试,我们在一开始就逃脱了一个[。
所以我只能解释回声所起的作用。
在终端中输入 echo 命令时没有输出的原因是它是一段代码,默认情况下 x 和 i 都没有定义,所以所有输出都是空的。