如何在 Bash 脚本中使用 # 访问参数

如何在 Bash 脚本中使用 # 访问参数

我有一个脚本,用于将一系列单词和字符 slugify。问题是,当脚本参数使用 # 时,# 后面的其余行不会传递给我的脚本。如何访问 # 符号后面的参数(包括这些参数)?

例子:

$ make_slug this is a very long line #450

返回:

this-is-a-very-long-line

# 中的脚本参数在传递到脚本代码时被删除。示例代码:

arguments=""
for arg in "$@"
do
    echo "$arg"
    cleaned=`echo $arg | sed -e 's/[^0-9A-Za-z]//g' -e '/./!d'`
    arguments+=${cleaned,,}"-"
done
echo ${arguments::-1}

答案1

我可能不明白你的问题,这里我假设你有一个文件/变量,其中包含多行文本,你想删除每行中从符号#到行尾的所有文本。

如果是这种情况,并且假设您不希望在转义事件中出现此行为\#,那么我会这样做:

sed 's/\([^\\]\)#.*$/\1/g' filename

如果文本包含在文件中filename,或者包含在变量中var

sed 's/\([^\\]\)#.*$/\1/g' <<< "$variable"

例子

假设你的文件filename包含以下文本

This is a line#this is a comment
this is another line without comments
this is a line with an escaped sharp symbol \# and therefore this is NOT a comment

那么上述命令的结果为

This is a line
this is another line without comments
this is a line with an escaped sharp symbol \# and therefore this is NOT a comment

解释

sed 's/\([^\\]\)#.*$/\1/g'
  • seds特林编辑itor: 's/matched-pattern/replaced-pattern/options'.s代表sg替代,以及选择Global,即在第一次替换后不会停止。
  • [^\\]数学的一切不是反斜杠\(需要转义,因此使用两个\\
  • \(pattern\)存储匹配项并在替换模式中pattern引用\1
  • .*$匹配任意字符,直到行尾

相关内容