eval并且exec都内置在执行命令的 bash(1) 命令中。
我也看到exec有几个选项,但这是唯一的区别吗?他们的上下文会发生什么?
例如,我有一个变量:
env_name="GOPATH"
Run Code Online (Sandbox Code Playgroud)
现在我想像这样获取环境变量GOPATH:
echo $GOPATH
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得$GOPATH通过$env_name?
我试图自己解决这个问题,但无数的选择让我感到困惑。
我想理想地使用ffmpeg或mencoder(或其他东西,但我知道我正在工作的那两个)将任何传入的视频转换为固定的屏幕尺寸。
如果视频较宽或太短,则将视频居中裁剪。如果它不是正确的尺寸,则向上或向下调整大小以使其与固定的屏幕尺寸完全一致。
我需要的最后一件事是带有 MP3 音轨的 XVid AVI 中的 720x480。
我发现很多页面都显示了如何将大小调整为最大分辨率,但我需要视频恰好是该分辨率(裁剪掉多余的部分,没有黑条)。
任何人都可以告诉我要运行的命令行 - 或者至少让我了解一些/大部分方式吗?如果需要多个命令行(运行 X 以获得分辨率,执行此计算,然后使用该计算的输出运行 Y),我可以编写脚本。
我有一个 bash 函数来设置$PATH这样的——
assign-path()
{
str=$1
# if the $PATH is empty, assign it directly.
if [ -z $PATH ]; then
PATH=$str;
# if the $PATH does not contain the substring, append it with ':'.
elif [[ $PATH != *$str* ]]; then
PATH=$PATH:$str;
fi
}
Run Code Online (Sandbox Code Playgroud)
但问题是,我必须为不同的变量编写不同的函数(例如,为$CLASSPATHlikeassign-classpath()等编写另一个函数)。我找不到将参数传递给 bash 函数的方法,以便我可以通过引用访问它。
如果我有类似的东西会更好 -
assign( bigstr, substr )
{
if [ -z bigstr ]; then
bigstr=substr;
elif [[ bigstr != *str* ]]; then
bigstr=bigstr:substr;
fi
}
Run Code Online (Sandbox Code Playgroud)
任何想法,如何在 bash …
这是我的小 bash 脚本片段。
i=5
command='echo $i'
$command
Run Code Online (Sandbox Code Playgroud)
我希望这个脚本打印,5即,我希望它运行 echo 并打印 5。但它一直在打印$i。那么我该如何解决这个问题呢?
您经常听到它eval is evil,无论是在 Shell/POSIX 世界中,还是在其他语言(如 python 等)中...
但我想知道,它真的没用吗?或者是否有一些神秘的、未记录的、有趣的或只是有用的用例?
如果答案以sh/bash为中心,我会更喜欢,但如果它也与其他壳有关,那也没关系。
该站点上的许多答案和评论都提到通常应避免eval在 shell 脚本中使用。这些评论通常是针对初学者的。
我已经看到提到安全问题和健壮性,但很少有例子。
我已经明白命令是什么,以及如何使用它eval。但是,那里给出的答案仅简要提及使用eval. 值得注意的是,每个答案都指出这eval可能是一个主要的安全漏洞,但大多数只是将这一事实作为结束语而没有详细说明。这似乎值得进一步考虑,实际上是它自己的问题。
为什么是用eval一个坏主意?
当将它适当地使用?
是否有任何指导方针可以完全安全地使用它,或者它总是不可避免地存在安全漏洞?
编辑:这篇文章是我在发布这个问题时实际寻找的那种规范参考(答案)。任何滥用的人eval都可以指向此参考。
我有一些环境变量。我想动态转换多个这样的值。
环境变量:我正在使用printenv | grep proj_env_repo(这样做printenv | grep $value)来获取这个环境变量。
所以价值是 proj_env_repo
我的结果是
proj_env_repo_db_username=username
Run Code Online (Sandbox Code Playgroud)
我想把它转换成 TF_ENV_db_username=username
有人可以帮我吗?我正在寻找 bash 脚本中的函数。
a1="one"
a2="two"
a3="three"
for ((i=1;i<=3;i=i+1)); do
echo $a$i
done
Run Code Online (Sandbox Code Playgroud)
我已经尝试过以下
echo ${a$i}echo $((ai))echo ${a}${i}c=$(echo a$i)但没有人给出正确答案。