簡體   English   中英

Shell腳本。 我的腳本中的命令替換問題

[英]Shell scripting. Command substitution issue in my script

在我的Cygwin和我的Linux盒子(Debian)上,我遇到了同樣的問題:

我正在使用某種格式化ID的shell腳本,我想在斜杠出現(/)之前添加反斜杠()。

我的sed腳本在我的終端上運行良好:

# export someid="314-12345/08"
# echo "${someid}" | sed 's/\//\\\//'

輸出:

314-12345\/08

但是,如果我運行命令替換不是很好:

# someidformatted=`echo "${someid}" | sed 's/\//\\\//'`
sed: -e expression #1, char 9: unknown option to `s'

我在這里缺少什么?

先感謝您。

沒有義務使用/作為sed的分隔符。

s/a/c/

可能會變成

s#a#c#

所以在你的情況下:

someidformatted=`echo "${someid}" | sed 's#\/#\\\/#'`

會做的。

我只能猜測問題是由於某些缺乏/逃避造成的。

這是正在發生的事情。 從bash(1)手冊頁,強調我的:

當使用舊式反引號形式的替換時,反斜杠保留其字面含義, 除非后跟$,'或\\。 第一個不帶反斜杠的反引號會終止命令替換。 使用$(命令)表單時,括號之間的所有字符組成命令; 沒有人特別對待。

因此,與普通命令相比,命令替換需要更多的反斜杠。 您可以通過設置set -x來調試它:

# someidformatted=`echo "${someid}" | sed 's/\//\\\//'`
++ echo 314-12345/08
++ sed 's/\//\\//'
sed: 1: "s/\//\\//": bad flag in substitute command: '/'
+ someidformatted=
# someidformatted=$(echo "${someid}" | sed 's/\//\\\//')
++ echo 314-12345/08
++ sed 's/\//\\\//'
+ someidformatted='314-12345\/08'

因此,您可以看到\\\\的出現變為\\ 添加更多反斜杠有效,但我更喜歡$(command)形式:

# someidformatted=$(echo "${someid}" | sed 's/\//\\\//')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM