「Shell」- 常用字符串操作 | String

多行 Heredoc

cat > $FILE <<- EOM
Line 1.
Line 2.
EOM

cat > $FILE <<EOM
This is line 1.
This is line 2.
Line 3.
EOM

长度 string length

字符串长度 | Bash Find String – Javatpoint

1.  ${#string}
2.  expr length "$string"
3.  expr "$string" :'.*'
4.  $str | wc -c
5.  $str |awk '{print length}'

嵌入换行符 | newline

Trying to embed newline in a variable in bash [duplicate]

该部分将介绍如何在 BASH 的变量中嵌入换行符号。

直接插入 \n 序列

p="var1\nvar2"
echo -e "${p}"

# echo 命令的 -e 选项会将变量中的 \n 序列解释为换行符。

变量定义时插入换行符

p="var1
var2"
echo "${p}"

# 在该情况下,使用 echo 输出的变量必须使用双引号。如果未使用,则输出结果为:var1 var2

使用 $’\n’ 序列

p="var1"$'\n'"var2"
echo "${p}"

# BASH 会将$'\n'解释为一个换行符号。
# 在这种情况下,使用 echo 输出的变量必须使用双引号。如果未使用,则输出结果为:var1 var2

截取字符串 | substring()

with head

How to retrieve the first n characters of a variable in Bash? – Stack Overflow

echo $FOO | head -c 10
=> qwertzuiop

字符串替换 | replace()

with sed

unix – Replace a string in shell script using a variable – Stack Overflow

echo $LINE | sed -e “s/12345678/${replace}/g”

字符串重复 | repeat()

How can I repeat a character
How do I find the width & height of a terminal window?

要在终端里打印一条分隔线,这条分隔线由”#“组成,宽度与终端的宽度相同;

# 问题一、如何重复字符串?
printf '#%.0s' {1..100}

# 问题二、如何获取终端的宽度?
tput cols

# 合并后的代码
# 可能你需要在结尾加上一个换行符,默认 printf 是不带换行符的
printf '#%.0s' $(seq $(tput cols))

字符串 => 字符数组

Bash: Split string into character array

echo "abcdefg" | fold -w1

echo "abcdefg" | grep -E -o .

大小写转换 | Uppercase, Lowercase, …

How to convert a string to lower case in Bash?

tr '[:lower:]' '[:upper:]' <<< 'asdfasd asdfasdfas' # Uppercase

tr '[:upper:]' '[:lower:]' <<< 'asdfasd asdfasdfas' # Lowercase

string_uppercase () {
    echo -n "$1" | tr '[:lower:]' '[:upper:]'
}

string_lowercase () {
    echo -n "$1" | tr '[:upper:]' '[:lower:]'
}

字符串编码 | urldecode

bash – How to decode URL-encoded string in shell? – Stack Overflow

在 Bash 中,进行 urldecode 的方法,以及相关问题处理。

这段代码从 Stack Overflow 复制而来

function urldecode() { : "${*//+/ }"; echo -e "${_//%/\\x}"; }

function urldecode() { local i="${*//+/ }"; echo -e "${i//%/\\x}"; }

第一个写法太奇怪了,里面包含各种 Bash 知识:
1): 是为了防止 “${*//+/ }” 被当作命令来执行
2)$_ 表示前个命令的最后一个参数,也就是 “${*//+/ }” 的解析结果
3)$* 表示传入命令的全部参数
4)${p/+/ } 表示将变量 p 的 + 替换为空格,而 ${p//+/ } 表示将变量 p 的全部 + 替换为空格;

针对 cURL 请求

针对 cURL 命名,其提供相关命令行选项,不需要我们额外处理 urlencode() 文件。