相关疑难解决方法(0)

Unix命令将文本添加到文件中

是否有Unix命令将一些字符串数据添加到文本文件中?

就像是:

prepend "to be prepended" text.txt
Run Code Online (Sandbox Code Playgroud)

unix command-line utilities prepend

108
推荐指数
12
解决办法
7万
查看次数

如何读取文件并将其重定向到变量?

我有一个文件,上面写着一个字.我希望我的脚本将该单词放在变量中.

我怎样才能做到这一点?

linux shell scripting

34
推荐指数
2
解决办法
6万
查看次数

bash中的间接变量赋值

似乎在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)

bash quotes eval variable-assignment

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

将包含空字符(\ 0)的字符串分配给Bash中的变量

在尝试通过使用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 null-character

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

将文件读入变量,同时抑制"无此文件或目录"错误

我想将文本文件内容读入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)

但它很丑陋而且很麻烦.那么,是否有更好的语法,或者这毕竟是猫的有效用途?

bash

8
推荐指数
2
解决办法
1034
查看次数

对于有一行的文件,"$(cat file)","$(<file)"和"read ... <file"有什么区别?

我有一个只包含一行的输入文件:

$ 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 file strace

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

将文本文件保存在bash中的变量中

如何读取文本文件并将其保存为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)

linux bash shell terminal

7
推荐指数
2
解决办法
2万
查看次数

将整个文件读入 C-Shell (csh) 脚本中的变量

我需要将整个文本文件读入一个 shell 变量。已经有关于此的另一个线程,但它只给出了 sh 和 bash 的示例:

如何将文件读入shell中的变量?

我如何在 csh 中做到这一点?

很抱歉开始一个新线程,但我是这个网站的新手,无法发表评论。如果你不能一开始就发表评论,你应该如何建立自己的声誉?

shell csh

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

使环境变量等于文件的内容

我在 linux 上工作,我想为文件的内容设置一个环境变量:vi 文件:

the env var should equal everything in here
Run Code Online (Sandbox Code Playgroud)

现在文件有很多 " 和其他特殊字符,要花很多时间来转义它们。有没有更简单的方法?

linux environment-variables

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

如何在Bash脚本中显示两个文件的差异?

我正在尝试比较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脚本中显示这两个字符串的差异?

bash diff

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