bash 中双引号字符串内的单引号不被接受

2023-11-29

我正在尝试在 bash 中分配一个变量:

assignssid="airport -I | awk '/ SSID/ {print substr($0, index($0, $2))}'"

当我当前这样做时,然后运行echo "$assignssid",结果如下所示:

airport -I | awk '/ SSID/ {print substr(-bash, index(-bash, ))}'

如何让变量与引号内的代码一起使用?


问题:单引号在双引号内不符合语法

当你有"'$0'",只有那些外部引号是语法的(并控制 shell 如何扩展值:内部引号只是文字值,并且不改变如何扩展值)$0被治疗。


字面答案(仅限 bash):$''

如果您不希望遵循扩展,请不要使用双引号。

# assign the directory separately, just to make the line shorter for easier reading
dir=/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/

# now, expand the directory name in double quotes, but use the $'' quoting style otherwise
assignssid="$dir"$'airport -I | awk \'/ SSID/ {print substr($0, index($0, $2))}\''

Inside $'', \'是一个单引号(同样,\n是一个换行符,\t是一个选项卡等),并且不会发生参数扩展($'$0'是相同的'$0', not "$0").

完成此操作后,您可以看到echoing 变量会发出完整的单引号内容的命令:

$ echo "$assignssid"
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I | awk '/ SSID/ {print substr($0, index($0, $2))}'

...或者,与您可能预期的用例更密切相关:

current_ssid=$(eval "$assignssid")

字面答案(POSIX sh):'"'"'

让我们以这样的方式做第一个答案isn't仅 bash:

dir=/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/
assignssid="$dir"'airport -I | awk '"'"'/ SSID/ {print substr($0, index($0, $2))}'"'"''

该字符串的作用如下:

  • 首先'关闭单引号上下文
  • 首先"打开双引号上下文
  • 下列'是字面意思,因此成为你的价值的一部分
  • 下列"关闭双引号上下文
  • 决赛'恢复原始的单引号上下文

最佳实践答案:使用函数存储代码

字符串变量根本不适合这项工作。相反,使用一个函数:

airport_dir=/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/
assignssid() {
    "$airport_dir"/airport -I | awk '/ SSID/ {print substr($0, index($0, $2))}'
}

...此后:

current_ssid=$(assignssid)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

bash 中双引号字符串内的单引号不被接受 的相关文章

  • Linux:在文件保存时触发 Shell 命令

    我想在修改文件时自动触发 shell 命令 我认为这可以通过注册 inotify 挂钩并调用来在代码中完成system 但是是否有更高级别的 bash 命令可以完成此任务 尝试 inotify 工具 我在复制链接时遇到问题 抱歉 但 Git
  • 如何从 bash 数组中删除元素而不展平数组

    我想创建一个采用 bash 数组的函数 如下所示 a element zero element one element two 并删除一个元素 如 元素一 并留下一个数组 如下所示 a element zero element two 这样
  • 在 bash 脚本中提取 XML 值 [重复]

    这个问题在这里已经有答案了 我正在尝试从 xml 文档中提取一个值 该文档已作为变量读入我的脚本中 原始变量 data is
  • 使用 sh 运行 bash 脚本

    我有 bash 脚本 它需要 bash 另一个人尝试运行它 sh script name sh 它失败了 因为 sh 是他的发行版中 dash 的符号链接 ls la bin sh lrwxrwxrwx 1 root root 4 Aug
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • 如何以管理员身份在 rake 任务中运行 shell 命令?

    我有一个简短的 cmd 文件 我想将其作为部署过程的一部分运行 不幸的是 cmd 文件需要管理员权限 是否可以从 rake 中获得管理员权限 或者我是否需要以管理员身份启动 shell 您可以尝试runas http ss64 com nt
  • 为什么我可以直接从 bash 执行 JAR?

    我是一个长期从事 Java 工作的人 并且知道运行带有主类的 JAR 的方法MANIFEST MFJar 中的文件很简单 java jar theJar jar 我用它来启动 Fabric3 服务器 包含在bin server jar在其标
  • 使用正则表达式模式查找 -name 并使用 cp 替换文件名

    目前我正在使用该命令cron复制 data从源到目标路径 find source path name data exec cp target path 源码结构为 source path category1 001 data source
  • 分叉/多线程进程|重击

    我想让我的代码的一部分更加高效 我正在考虑让它分叉成多个进程 并让它们一次执行 50 100 次 而不是只执行一次 例如 伪 for line in file do foo foo2 foo3 done 我希望这个 for 循环运行多次 我
  • bash中的用户名、密码程序

    我有一个程序 要求用户输入用户名和密码 然后将其存储在文本文件中 第一列是用户名 第二列是密码 我需要一个命令 在用户输入用户名和新密码时替换密码 如下我拥有的 bin bash admin menu Register User echo
  • shell-out 值到 md5(加密)函数

    我正在寻找一种解决方案 我正在构建 JSON 记录 并需要在 JQ 中生成一些文本 但将此文本通过管道传输到 MD5 求和函数并将其用作键的值 echo first John last Big jq id first last md5 通过
  • 为什么 $((true == false)) 在 bash 中计算结果为 1?

    为什么 bash 有以下行为 echo true false 1 我本以为这会打印0 但它打印1 以下事实使情况变得更加复杂 gt echo true 0 gt echo false 0 gt echo true true 1 gt ech
  • 当 grep "\\" XXFile 我得到“尾随反斜杠”

    现在我想查找是否有包含 字符的行 我试过grep XXFile但它暗示 尾随反斜杠 但当我尝试时grep XXFile没关系 谁能解释一下为什么第一个案例无法运行 谢谢 区别在于 shell 处理反斜杠的方式 当你写的时候 在双引号中 sh
  • 如何在 PHP 中运行 shell 脚本?

    我正在尝试使用 PHP 触发 shell 脚本的运行 本质上 当用户在我们用 PHP 编写的网站上完成一个操作时 我们希望触发一个 shell 脚本 该脚本本身调用一个 Java 文件 提前致谢 See shell exec http ph
  • 将 stdout 和 stderr 重定向到带有前缀的单个文件

    我正在编写一个 bash 脚本 需要重定向stdout and stderr我运行到单个文件的命令的输出 在每行前面加上前缀stderr or stdout 因此 有没有一个简单的方法可以做到这一点 from Debian http www
  • Linux 仅使用时间/日期戳重命名文件

    我有一个文件 我想将 mv 重命名为year month day h m s 最好的方法是什么 我已尝试以下操作 但它不会动态添加正确的标记 原始文件名称中实际上有一个反斜杠 mv getnw myfilename txt Y m d H
  • 为什么在使用 Javascript 变量之前不需要先声明它?

    在 Javascript 中我们不需要声明变量var使用关键字之前 我们可以立即做类似的事情myCount 12 or myStr Hello 其中 myCount myStr 之前未声明 任何此类用法都会在 全局 范围内声明并初始化变量
  • 每个命令都返回“bash:<命令>:找不到命令...”[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我刚刚安装了 Scala 并添加了路径gedit bashrc export SCALA HOME home avijit sca
  • 使用 XMLStarlet(图像注释)将值连接到现有 xml 属性

    我正在使用 xml 来注释图像 我正在使用 xmlstarlet 和 unix bash 命令 但当我尝试将值附加到现有 xml 属性值时遇到一些问题 例如 我有
  • 在 bash 中从文件中读取星号字符 (*)

    我正在从 txt 文件中获取行 说输入 txt a b 然后我正在阅读它 bin bash file 1 ans 0 while read r line n line do echo line done lt file passing th

随机推荐