Bash脚本如何替换URL中?符号后面的指定子串
Bash脚本替换URL问号后内容的可行实现
直接用Bash原生的参数扩展就能实现需求,不需要调用外部expr工具,逻辑更简洁高效:
#!/bin/bash url="https://example.com/tfzzr?uhg" replace_string="abc" # 判断URL是否包含? if [[ "$url" == *"?"* ]]; then # ${url%%\?*} 表示从url末尾匹配最长的?开头的内容并删除,保留?前的部分 new_url="${url%%\?*}?$replace_string" else # 若URL无?,可按需选择直接拼接?和替换串,或是保留原URL new_url="$url?$replace_string" fi echo "原URL:$url" echo "替换后URL:$new_url"
原有代码思路的修正版
如果要沿用你计算问号位置的思路,需要修正变量赋值、子串截取的语法错误:
- Bash变量赋值时等号两侧不能有空格,捕获命令输出需要用
$()包裹命令 expr index返回的位置从1开始计数,而Bash子串截取的起始下标从0开始,需要做偏移转换
修正后代码如下:
#!/bin/bash url="https://example.com/tfzzr?uhg" replace_string="abc" # 获取?第一次出现的位置,不存在则返回0 first=$(expr index "$url" "?") if [ "$first" -ne 0 ]; then # 截取?之前的前缀 prefix=${url:0:$((first - 1))} new_url="$prefix?$replace_string" else new_url="$url?$replace_string" fi echo "替换后URL:$new_url"
内容的提问来源于stack exchange,提问作者Andrewboy
相关产品推荐
相关产品推荐

