如何将sed命令输出存入变量且不打印到屏幕(含多参数场景)
解决sed提取首行存入变量及多参数传递问题
嘿,这个问题我太熟悉了!咱们分两部分来拆解,保证你能搞明白:
一、把sed结果存入变量,避免屏幕输出
shell里要捕获命令的输出并赋值给变量,核心就是用命令替换——也就是$()(推荐用这个,嵌套更清晰)或者反引号``。这样sed的输出就会被直接存到变量里,不会默认打印到屏幕上。
你的命令还可以简化一下(1q已经会打印首行然后退出,d是多余的),最终写法是:
first_line=$(sed '1q' "../dbs/$1/$2")
执行这条语句后,$first_line变量就存储了目标文件的首行内容,终端不会有任何输出。
二、传入其他参数的同时存储sed输出
不管你是在脚本里接收多个参数,还是在命令行同时传递额外参数,逻辑都是一样的:先处理参数传递,再用命令替换捕获sed输出即可。
情况1:在脚本中接收多个参数
假设你写了一个脚本get_header.sh,需要接收路径参数和其他自定义参数,示例代码如下:
#!/bin/bash # 接收原有路径参数:$1是目录名,$2是文件名 # 接收额外参数:$3是自定义提示文本,$4是其他参数 dir_name="$1" file_name="$2" custom_tip="$3" extra_param="$4" # 提取首行并存入变量 first_line=$(sed '1q' "../dbs/$dir_name/$file_name") # 现在可以同时使用所有变量 echo "自定义提示:$custom_tip" echo "额外参数:$extra_param" echo "文件首行内容:$first_line"
执行脚本时直接传递所有参数:
./get_header.sh user_db config.txt "提取的配置文件首行:" "version_1.0"
情况2:在命令行直接传递参数
如果是在终端直接执行,你可以先定义额外参数,再执行赋值操作,比如:
# 先设置额外参数 extra_info="这是测试文件的首行" # 提取首行并存入变量,同时可以使用已定义的参数 first_line=$(sed '1q' "../dbs/test_dir/test_file.txt") # 验证结果 echo "$extra_info: $first_line"
或者也可以在一行内完成参数传递和赋值:
extra_info="测试信息" first_line=$(sed '1q' "../dbs/test_dir/test_file.txt")
小补充
为什么原来的sed会输出到屏幕?因为sed默认会把处理后的内容输出到标准输出,而命令替换$()会捕获这个标准输出,直接赋值给变量,从而避免了内容打印到终端。
内容的提问来源于stack exchange,提问作者Hat hout
相关产品推荐
相关产品推荐

