是否有Unix命令将一些字符串数据添加到文本文件中?
就像是:
prepend "to be prepended" text.txt
Run Code Online (Sandbox Code Playgroud) 我有一个文件,上面写着一个字.我希望我的脚本将该单词放在变量中.
我怎样才能做到这一点?
似乎在bash中建议的间接变量设置方法是使用eval
:
var=x; val=foo
eval $var=$val
echo $x # --> foo
Run Code Online (Sandbox Code Playgroud)
问题是通常的问题eval
:
var=x; val=1$'\n'pwd
eval $var=$val # bad output here
Run Code Online (Sandbox Code Playgroud)
(并且因为在很多地方推荐,我想知道有多少脚本因此而易受攻击...)
在任何情况下,使用(转义)引号的明显解决方案并不真正起作用:
var=x; val=1\"$'\n'pwd\"
eval $var=\"$val\" # fail with the above
Run Code Online (Sandbox Code Playgroud)
问题是bash有(with ${!foo}
)烘焙的间接变量引用,但是我没有看到任何这种方式来做间接赋值 - 有没有理智的方法来做到这一点?
为了记录,我找到了解决方案,但这不是我认为"理智"的东西......:
eval "$var='"${val//\'/\'\"\'\"\'}"'"
Run Code Online (Sandbox Code Playgroud) 在尝试通过使用NULL字符作为分隔符来正确处理文件//foldernames列表(请参阅我的其他问题)时,我偶然发现了Bash的一个奇怪的行为,我不明白:
将包含一个或多个NULL字符的字符串分配给变量时,将丢失/忽略/不存储NULL字符.
例如,
echo -ne "n\0m\0k" | od -c # -> 0000000 n \0 m \0 k
Run Code Online (Sandbox Code Playgroud)
但:
VAR1=`echo -ne "n\0m\0k"`
echo -ne "$VAR1" | od -c # -> 0000000 n m k
Run Code Online (Sandbox Code Playgroud)
这意味着我需要将该字符串写入文件(例如,在/ tmp中),如果不希望或不可行直接管道,则从那里读回.
在Z shell(zsh)中执行这些脚本时,在两种情况下都会保留包含\ 0的字符串,但遗憾的是我不能假设在运行我的脚本的系统中存在zsh而Bash应该是.
如何在不丢失任何(元)字符的情况下有效地存储或处理包含\ 0字符的字符串?
我想将文本文件内容读入Bash变量,如果该文件不存在则禁止显示错误消息.在POSIX中,我会这样做
var=$(cat file 2>/dev/null)
Run Code Online (Sandbox Code Playgroud)
但我读过(例如,如何将文件读入shell中的变量),这是在Bash中无用的猫.所以,我正在尝试这些:
var=$(< file 2>/dev/null)
var=$(< file) 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
但它首先不读取现有文件,-bash: file: No such file or directory
如果文件不存在则打印.为什么这不起作用?(特别是:什么彻底打破了第一个?)
这是什么工作:
{ var=$(< file); } 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
但它很丑陋而且很麻烦.那么,是否有更好的语法,或者这毕竟是猫的有效用途?
我有一个只包含一行的输入文件:
$ cat input
foo bar
Run Code Online (Sandbox Code Playgroud)
我想在我的脚本中使用这一行,有三种方法可以让我知道:
line=$(cat input)
Run Code Online (Sandbox Code Playgroud)
line=$(<input)
Run Code Online (Sandbox Code Playgroud)
IFS= read -r line < input
Run Code Online (Sandbox Code Playgroud)
例如,使用命令替换意味着我会生成一个子shell,而read
我不这样做,对吗?还有什么其他的差异,并且有一种方式优于其他方式?我也注意到(有strace
)只是因为某种原因read
触发了系统调用openat
.其他人怎么可能不这样做?
$ strace ./script |& grep input
read(3, "#!/usr/bin/env bash\n\ncat > input"..., 80) = 80
read(255, "#!/usr/bin/env bash\n\ncat > input"..., 167) = 167
read(255, "\nline=$(cat input)\nline=$(<input"..., 167) = 60
read(255, "line=$(<input)\nIFS= read -r line"..., 167) = 41
read(255, "IFS= read -r line < input\n", 167) = 26
openat(AT_FDCWD, "input", O_RDONLY) = 3
Run Code Online (Sandbox Code Playgroud) 如何读取文本文件并将其保存为bash中的变量?我的代码在这里:
#!/bin/bash
TEXT="dummy"
echo "Please, enter your project name"
read PROJECT_NAME
mkdir $PROJECT_NAME
cp -r -f /home/reza/Templates/Template\ Project/* $PROJECT_NAME
cd $PROJECT_NAME/Latest
TEXT = `cat configure.ac ` ## problem is here !!!
CHANGED_TEXT=${TEXT//ProjectName/$PROJECT_NAME}
echo $CHANGED_TEXT
Run Code Online (Sandbox Code Playgroud) 我需要将整个文本文件读入一个 shell 变量。已经有关于此的另一个线程,但它只给出了 sh 和 bash 的示例:
我如何在 csh 中做到这一点?
很抱歉开始一个新线程,但我是这个网站的新手,无法发表评论。如果你不能一开始就发表评论,你应该如何建立自己的声誉?
我在 linux 上工作,我想为文件的内容设置一个环境变量:vi 文件:
the env var should equal everything in here
Run Code Online (Sandbox Code Playgroud)
现在文件有很多 " 和其他特殊字符,要花很多时间来转义它们。有没有更简单的方法?
我正在尝试比较bash脚本中两个文件的内容.
local_file=$(cat my_local_file.txt)
remote_file=$(curl -s "http://example.com/remote-file.txt")
if [ local_file == remote_file ]; then
echo "Files are the same"
else
echo "Files are different. Here is the diff:"
diff <(echo "$local_file") <(echo "$remote_file")
fi
Run Code Online (Sandbox Code Playgroud)
当我运行脚本时,我发现我有一个语法错误:
./bin/check_files.sh: line 8: syntax error near unexpected token `('
./bin/check_files.sh: line 8: ` diff <(echo "$local_file") <(echo "$remote_file")'
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?如何从bash脚本中显示这两个字符串的差异?