相关疑难解决方法(0)

忘记在 bash/POSIX shell 中引用变量的安全隐患

如果您已经关注 unix.stackexchange.com 一段时间了,那么您现在应该知道,echo $var在 Bourne/POSIX shell(zsh 是例外)中的列表上下文(如)中不加引号的变量具有非常特殊的含义,并且除非你有很好的理由,否则不应该这样做。

在这里的许多问答中详细讨论了它(例如:为什么我的 shell 脚本会因空格或其他特殊字符而窒息?何时需要双引号?shell 变量的扩展以及 glob 和 split 对其的影响引用vs 不带引号的字符串扩展)

自从 70 年代末 Bourne shell 首次发布以来就是这种情况,并且没有被 Korn shell 改变(David Korn 最大的遗憾之一(问题 #7))或者bash大部分复制了 Korn shell,这就是POSIX/Unix 是如何指定的。

现在,我们仍然在这里看到许多答案,甚至偶尔会公开发布未引用变量的 shell 代码。你会认为人们现在已经学会了。

根据我的经验,主要有 3 类人会省略引用他们的变量:

  • 初学者。这些可以被原谅,因为它是一种完全不直观的语法。我们在这个网站上的职责是教育他们。

  • 健忘的人。

  • 即使经过反复锤击也不相信的人,他们认为Bourne shell 的作者肯定没有打算让我们引用所有变量

如果我们揭露与此类行为相关的风险,也许我们可以说服他们。

如果您忘记引用变量,那么最糟糕的事情是什么。真的有那么糟糕吗?

我们在这里谈论什么样的漏洞?

在什么情况下会出现问题?

shell security bash shell-script quoting

241
推荐指数
3
解决办法
3万
查看次数

bash - 用新行替换空格

如何在输入中用新行替换空格,例如:

/path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5 等等...

要获得以下内容:

/path/to/file
/path/to/file2
/path/to/file3
/path/to/file4
/path/to/file5
Run Code Online (Sandbox Code Playgroud)

笔记

我发布这个问题是为了帮助其他用户,在我开始输入这个问题之前,在 UNIX SE 上找到有用的答案并不容易。之后我发现了以下内容:

相关问题

如何找到并替换新行?

bash string text-processing

120
推荐指数
5
解决办法
23万
查看次数

了解 IFS

本站点和 StackOverflow 上的以下几个线程有助于理解IFS工作原理:

但我还有一些简短的问题。我决定在同一篇文章中问他们,因为我认为这可能有助于更好的未来读者:

一季度。 IFS通常在“字段拆分”的上下文中讨论。是场分裂一样的分词

Q2: POSIX 规范

如果IFS 的值为空,则不进行字段拆分。

设置IFS=是否与设置IFS为空相同?这也是将其设置为 an 的意思empty string吗?

Q3:在 POSIX 规范中,我阅读了以下内容:

如果没有设置 IFS,shell 的行为就像 IFS 的值是 <space>, <tab> and <newline>

假设我想恢复IFS. 我怎么做?(更具体地说,我如何引用<tab><newline>?)

Q4:最后,这段代码如何:

while IFS= read -r line
do    
    echo $line
done < /path_to_text_file
Run Code Online (Sandbox Code Playgroud)

如果我们将第一行更改为

while read -r line # Use …
Run Code Online (Sandbox Code Playgroud)

shell

83
推荐指数
3
解决办法
11万
查看次数

如何遍历文件的行?

说我有这个文件:

hello
world
hello world
Run Code Online (Sandbox Code Playgroud)

这个程序

#!/bin/bash

for i in $(cat $1); do
    echo "tester: $i"
done
Run Code Online (Sandbox Code Playgroud)

产出

tester: hello
tester: world
tester: hello
tester: world
Run Code Online (Sandbox Code Playgroud)

我希望for对每一行进行迭代,分别忽略空格,即最后两行应替换为

tester: hello world
Run Code Online (Sandbox Code Playgroud)

使用引号for i in "$(cat $1)";会立即i分配整个文件。我应该改变什么?

shell control-flow

71
推荐指数
3
解决办法
27万
查看次数

IFS 是否用于读取 shell-builtin 以外的其他用途?

每当我阅读 IFS 时,它总是在上下文中read(或者至少我如此理解)。

IFS 是否用于除readshell 内置之外的任何其他用途?

shell

1
推荐指数
1
解决办法
71
查看次数

如何将参数扩展与命令替换一起使用?

    \n
  • 我想创建 12 个以月份命名的目录。因此,我尝试使用locale管道来获取月份名称,用逗号tr分隔它们,然后用大括号括起来并传递给mkdir. 但整体被视为一根弦。有办法避免这种情况吗?
  • \n
\n
16:07: temp \xe2\xa7\xb2 mkdir {$(locale mon | tr \\; ,)}\n\n16:18: temp \xe2\xa7\xb2 ls -lh\ntotal 4.0K\ndrwxr-xr-x. 2 john john 4.0K Dec 11 16:18 {January,February,March,April,May,June,July,August,September,October,November,December}\n\n16:18: temp \xe2\xa7\xb2 \n
Run Code Online (Sandbox Code Playgroud)\n

shell bash parameter command-substitution

0
推荐指数
1
解决办法
105
查看次数