我正在尝试编写一个创建别名并将其写入文件的函数。我这样写是为了让用户输入 $1 的别名名称和 $2 的别名旅行路径。 我有 2 个变量
$alias_name
和 $path_to_add
分别存储 $1 $2。然后我有第三个变量 $jp_string
看起来像这样:
`jp_string="别名 $alias_name='cd $path_to_add'"
该函数检查两个参数是否存在,如果存在,则使用它们填充 $jp_string 的空格,然后将 $jp_string 写入文件。一切正常,除了当我运行脚本时,我的字符串中的“别名”一词作为命令运行,而不是仅仅被视为一个字符串。如何编写 $jp_string 变量,以便将其解析为双引号中的字符串而不是命令?感谢任何帮助我在别处寻找答案并不断接近但不完全是。我了解到您需要将像 '$' 这样的特殊符号转义为 $ 才能在字符串中使用它,但是您如何在字符串中“转义”诸如 'alias' 或 'cd' 之类的命令?
所以在这个函数中,如果我传入例如“myalias”和“my/new/path”作为参数 $1 和 $2。这是我得到的输出错误:
addPathToJumpPoints:11: 别名 myalias='cd' not found
function addPathToJumpPoints() {
alias_name=$1
path_to_add=$2
xjp_file=$XFILES/.xtest
jp_string=""
if [[ ! -z $alias_name ]]; then
if [[ ! -z $path_to_add ]]; then
$jp_string="alias $alias_name='cd $jp_path'"
if [[ -d $path_to_add ]]; then
echo $jp_string >> $xjp_file
echo "Jump point to: [$path_to_add] was created!"
else
echo "[$path_to_add] does not exist, would you like to create it? (y/n)"
read make_path
if [[ $make_path == "y" ]]; then
mkdir $path_to_add
echo $jp_string >> $xjp_file
echo "$path_to_add and a jump point to it were created!"
elif [[ $make_path == "n" ]]; then
echo "Should a jump point be made regardless? (y/n)"
read make_jp
if [[ $make_jp == "y" ]]; then
echo $jp_string >> $xjp_file
echo "Jump point to [$path_to_add] was created!"
elif [[ $make_jp == "n" ]]; then
echo "No jump point was created."
else
echo "Invalid answer!. Enter only 'y' for yes and 'n' for no."
fi
else
echo "Invalid answer. Enter only 'y' for yes and 'n' for no."
fi
fi
else
echo "Please provide a path to create a jump point"
fi
else
echo "Please provide an alias and a path to create a jump point!"
fi
}
这条线
$jp_string="alias $alias_name='cd $jp_path'"
尝试将行更新为以下内容:
jp_string="alias $alias_name='cd $path_to_add'"
从字里行间,我想我能猜到你想要完成什么。
您正在创建一个变量(或者更确切地说,试图),而不是函数或别名。你不能声明接受参数的别名(这是一个常见的初学者常见问题解答)但看起来你正在寻找像
这样的函数add_jp () {
alias $1="cd '$2'"
echo "alias $1=\"cd '$2'\""
}
echo
可能很有用,因此您可以将输出重定向到文件。 (否则我建议不要这样做。脚本的其余部分应将其诊断消息输出到标准错误;
echo "informational message" >&2
并且可能还包括脚本的名称。一个常见的安排是创建一个简单的函数来执行此操作;
warn () {
echo "${0##*/}: $*" >&2
}
:
warn "informational message"
参数扩展从
$0
中删除最后一个斜线之前的所有内容,因此打印没有路径的当前脚本名称。包括发出消息的实用程序的名称可以帮助您了解当您有脚本调用脚本时发生了什么,其中一个脚本告诉您一些有用的信息。)
您也可以将别名声明放在字符串中,然后是
eval "$jq_string"
,但您通常希望避免使用 eval
,尤其是当您 eval
包含未经审查的用户输入时。这是一个重要的安全考虑,严重到最简单的规则实际上只是“避免eval
,即使你认为你知道自己在做什么。”