我想有一个bash函数,打印给定字符串的特定列。
我的解决方案工作正常,但它是冗长的,看起来丑陋的我。
验证码:
#!/bin/bash
function get_ip_segment() {
case "$2" in
1)
printf "%s" "$(echo $1 | awk -F '.' '{print $1}')"
;;
2)
printf "%s" "$(echo $1 | awk -F '.' '{print $2}')"
;;
3)
printf "%s" "$(echo $1 | awk -F '.' '{print $3}')"
;;
4)
printf "%s" "$(echo $1 | awk -F '.' '{print $4}')"
;;
*)
printf "%s" "$1"
;;
esac
}
IP="12.34.56.78"
echo $IP
echo "$(get_ip_segment $IP 1)"
echo "$(get_ip_segment $IP 2)"
echo "$(get_ip_segment $IP 3)"
echo "$(get_ip_segment $IP 4)"
输出:
12.34.56.78
12
34
56
78
然后,我试图通过删除switch
结构来优化这段代码,但它打印了一个意外的输出。
printf "%s" "$(echo $1 | awk -F '.' '{print column_id}' column_id=$2)"
输出:
1
2
3
4
但不知何故,变量替换在awk
中不能正确工作。如果我能有一个一行长的函数而不是这个冗长的函数,那就太好了。
3条答案
按热度按时间yptwkmov1#
你可以这样做:
8fq7wneg2#
在任何POSIX shell中使用任何awk:
ar7v8xwq3#
在普通的Bash中:
在POSIX shell中: