Questions tagged «variable-substitution»


3
命令替换可以嵌套在变量替换中吗?
我想在通过命令访问的特定字符串上使用变量替换。例如,如果我将某些内容复制到剪贴板中,则可以这样访问它。 $ xclip -o -selection clipboard Here's a string I just copied. 如果将其分配给变量,则可以对其进行变量替换。 $ var=$(xclip -o -selection clipboard) $ echo $var Here's a string I just copied. $ echo ${var/copi/knott} Here's a string I just knotted. 但是,有没有办法在不将其分配给变量的情况下进行变量替换?从概念上讲,是这样的。 $ echo ${$(xclip -o -selection clipboard)/copi/knott} bash: ${$(xclip -o -selection clipboard)/copi/knott}: bad substitution …

2
如果未设置,则追加到类似PATH的变量而不创建前导冒号
我需要将目录附加到PKG_CONFIG_PATH。通常,我会使用标准 export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:$(pyenv prefix)/lib/pkgconfig 但PKG_CONFIG_PATH以前未在我的系统上设置过。因此,变量以一个:字符开头,该字符告诉该变量首先在当前目录中查找。我不要那个。我解决了以下问题, export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}${PKG_CONFIG_PATH:+:}$(pyenv prefix)/lib/pkgconfig 但这看起来太丑了。有没有更好的办法?当且仅当已设置变量时,有条件地附加冒号的适当方法是什么?

3
如何将存储在变量中的参数传递给WGET
我正在编写一个广泛使用wget的bash脚本。为了在一处定义所有通用参数,我将它们存储在变量中。这是一段代码: useragent='--user-agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0"' cookies_file="/tmp/wget-cookies.txt" save_cookies_cmd="--save-cookies $cookies_file --keep-session-cookies" load_cookies_cmd="--load-cookies $cookies_file --keep-session-cookies" function mywget { log "#!!!!!!!!!# WGET #!!!!!!!!!# wget $quiet $useragent $load_cookies_cmd $@" wget $useragent $load_cookies_cmd "$@" } 遗憾的是没有工作。不知何故,我缺少将参数存储在变量$ useragent,$ save_cookies_cmd,$ load_cookies_cmd以及将这些var作为参数传递的wget上的正确方法。 我想要这样的结果命令行: wget --user-agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" --load-cookies /tmp/wget-cookies.txt --keep-session-cookies …

10
Bash:提取IPv4地址的四个部分之一
我们可以使用语法${var##pattern}并${var%%pattern}提取IPv4地址的最后一部分和第一部分: IP=109.96.77.15 echo IP: $IP echo 'Extract the first section using ${var%%pattern}: ' ${IP%%.*} echo 'Extract the last section using ${var##pattern}: ' ${IP##*.} 我们如何使用参数扩展来提取IPv4地址的第二部分或第三部分? 这是我的解决方案:我使用数组并更改IFS变量。 :~/bin$ IP=109.96.77.15 :~/bin$ IFS=. read -a ArrIP<<<"$IP" :~/bin$ echo ${ArrIP[1]} 96 :~/bin$ printf "%s\n" "${ArrIP[@]}" 109 96 77 15 此外,我已经写了使用一些解决方案awk,sed以及cut命令。 现在,我的问题是:是否有一个不使用数组和IFS更改的基于参数扩展的简单解决方案?

2
Grep找到正确的行,用sed更改内容,然后将其放回原始文件中?
我正在尝试更改文件中特定行上的单个单词,但是将所有单词连接在一起时遇到了一些麻烦。 基本上,在文件的一行上有一个关键字“ firmware_revision”,并且在这一行(并且只有这一行)上,我想用“生产”一词代替“测试”一词。 所以我可以这样做: grep 'firmware_revision' myfile.py | sed 's/test/production' 这将挑选出我想要的行并执行替换,但是我不知道如何将新行插入原始文件以替换旧行。我显然不能仅仅将其重定向回文件,那么该怎么办? 即使我使用临时文件,通过使用临时grep文件,我也需要丢失文件中的所有其他数据,因此,我不再只能将所有文件重定向到临时文件,而是用临时文件替换原始文件。 编辑-有人要求更多信息 可以说我有一个像这样的文件 [ ('key_name1', str, 'value1', 'Description'), ('key_name2', str, 'value2', 'Description'), ('key_name3', str, 'value3', 'Description'), ('firmware_revision', str, 'my-firmware-name-test', 'Firmware revision name') ] 现在,我想编写一个脚本(最好是单行代码),该脚本将找到包含“ firmware_revision”的行,并将该行中“ test”一词的所有实例更改为“ production”。“测试”一词可能在该文件的其他位置,我不希望更改这些内容。为了清楚起见,我想将上面的行更改为 ('firmware_revision', str, 'my-firmware-name-production', 'Firmware revision name') 我该怎么做呢?

2
管道bash字符串操作
我读过其他一些管道bash字符串操作问题,但它们似乎是专门的应用程序。 从本质上讲,有没有一种方法可以使以下操作更简单? 代替 $ string='hello world'; string2="${string// /_}"; echo "${string2^^}" HELLO_WORLD 就像是 $ echo 'hello world' | $"{-// /_}" | "${ -^^}" HELLO_WORLD 编辑我有兴趣尽可能保持bash操纵以保持速度(与sed / awk相反,后者往往会大大减慢我的脚本的速度) Edit2:@jimmij 我喜欢第二个示例,并引导我编写了一个函数。 bash_m() { { read x; echo "${x// /_}"; } | { read x; echo "${x^^}"; }; } echo hello world | bash_m …

5
在Bash数组上使用参数替换
我有要读入Bash数组的file.txt文件。然后,我需要删除空格,双引号以及每个条目中除第一个逗号以外的所有内容。这是我走了多远: $ cat file.txt 10,this 2 0 , i s 30,"all" 40,I 50,n,e,e,d,2 60",s e,e" $ cat script.sh #!/bin/bash readarray -t ARRAY<$1 ARRAY=( "${ARRAY[@]// /}" ) ARRAY=( "${ARRAY[@]//\"/}" ) for ELEMENT in "${ARRAY[@]}";do echo "|ELEMENT|$ELEMENT|" done $ ./script.sh file.txt |ELEMENT|10,this| |ELEMENT|20,is| |ELEMENT|30,all| |ELEMENT|40,I| |ELEMENT|50,n,e,e,d,2| |ELEMENT|60,se,e| 除逗号情况外,哪种效果都很好。我知道有很多方法可以给这只猫换皮,但是由于这是其中较大的脚本,所以我真的很想使用参数替换到达此处: |ELEMENT|10,this| |ELEMENT|20,is| |ELEMENT|30,all| |ELEMENT|40,I| …

1
使用ssh和shell脚本在远程计算机上使用变量执行命令
我想使用本地计算机上的脚本来执行位于远程计算机上的命令和脚本。我知道可以使用来执行这些命令ssh,所以我做了: #!/bin/bash ssh username@target 'cd locationOf/theScript/; ./myScript.sh' 它运作完美。我希望此脚本使用变量更通用。现在它是: #!/bin/bash LOCATION=locationOf/theScript/ EXEC=myScript.sh ssh username@target 'cd ${LOCATION}; ./${EXEC}' 我得到这个错误: bash: ./: is a directory 我想远程机器不知道这些变量。那么有没有办法将它们导出到目标?

3
bash $ {VAR // search / replace}和奇怪的正则表达式行为
我正在尝试使用$ {VAR // search / replace}参数扩展对变量进行搜索和替换。我有一个相当漫长而邪恶的PS1,我想算出扩展后的大小。为此,我必须删除一堆我塞进其中的转义序列。但是,在尝试删除所有ANSI CSI SGR序列时,我遇到了语法问题。 鉴于我的PS1: PS1=\[\033]0;[\h] \w\007\]\[\033[1m\]\[\033[37m\](\[\033[m\]\[\033[35m\]\u@\[\033[m \]\[\033[32m\]\h\[\033[1m\]\[\033[37m\]\[\033[1m\])\[\033[m\]-\[\033[1m\](\[\033[m \]\t\[\033[37m\]\[\033[1m\])\[\033[m\]-\[\033[1m\](\[\033[m\]\[\033[36m\]\w\[\033[1m \]\[\033[37m\])\[\033[35m\]${git_branch}\[\033[m\]\n$ (是的,我知道病了...) 我正在尝试做: # readability search='\\\[\\033\[[0-9]*m\\\]' # do the magic sane="${PS1//$search/}" 但是这些似乎有点贪婪[0-9](几乎就像[0-9]被当作​​一个.替代): echo "${PS1//$search/}" \[\033]0;[\h] \w\007\]\n$ 如果我删除*,然后更改[0-9]为[0-9][0-9](这是更说明性的),那么我将接近预期的结果: $ search='\\\[\\033\[[0-9][0-9]m\\\]' $ echo "${PS1//$search/}" \[\033]0;[\h] \w\007\]\[\033[1m\](\[\033[m\]\u@\[\033[m\]\h\[\033[1m \]\[\033[1m\])\[\033[m\]-\[\033[1m\](\[\033[m\]\t\[\033[1m\])\[\033[m\]-\[\033[1m \](\[\033[m\]\w\[\033[1m\])$(git_branch)\[\033[m\]\n$ 为什么*(零个或多个)做疯狂的事情?我在这里想念什么吗?如果我通过sed传递相同的正则表达式,则会得到预期的结果: echo $PS1 | sed "s/$search//g" \[\033]0;[\h] \w\007\](\u@\h)-(\t)-(\w)$(git_branch)\n$
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.