จะเป็นตัวพิมพ์ใหญ่ของอาร์กิวเมนต์บรรทัดคำสั่งได้อย่างไร


125

ฉันค้นหาดังนั้นและพบว่าการใช้ตัวพิมพ์ใหญ่สตริงต่อไปนี้จะใช้งานได้

str="Some string"
echo ${str^^}

แต่ฉันพยายามทำสิ่งที่คล้ายกันในอาร์กิวเมนต์บรรทัดคำสั่งซึ่งทำให้ฉันมีข้อผิดพลาดดังต่อไปนี้

พยายาม

#!/bin/bash
             ## Output
echo ${1^^}  ## line 3: ${1^^}: bad substitution
echo {$1^^}  ## No error, but output was still smaller case i.e. no effect

เราจะทำสิ่งนี้ได้อย่างไร


8
มันทำงานสำหรับฉันเพียงแค่ปรับ โพสต์สคริปต์ทั้งหมดของคุณอาจมีข้อผิดพลาดอยู่ที่อื่น Shebang ของคุณชี้ไปที่bash?
จัดการ

เป็นไปได้เช่นเดียวกับ: stackoverflow.com/questions/2264428/...
Ciro Santilli新疆改造中心法轮功六四事件

คำตอบ:


151

ไวยากรณ์str^^ที่คุณพยายามใช้นั้นมีให้ตั้งแต่ Bash 4.0 ขึ้นไป บางทีคุณอาจเป็นรุ่นเก่ากว่า (หรือคุณรันสคริปต์ด้วยshอย่างชัดเจน):

ลองสิ่งนี้:

str="Some string"
printf '%s\n' "$str" | awk '{ print toupper($0) }'

1
จากคำพูดของ mtk ฉันเข้าใจว่าการแก้ไขกรณีใช้งานได้จริงสำหรับเขาด้วยตัวแปร
จัดการ

1
@ การทำงานที่ไม่ได้ระบุไว้อย่างชัดเจนในคำถามเริ่มต้น ข้อความแสดงข้อผิดพลาดการแทนที่ไม่ถูกต้องเหมือนกับที่คุณได้รับเมื่อใช้เวอร์ชันทุบตีรุ่นเก่า
Bernhard

4
คุณถูก. ฉันตรวจสอบเวอร์ชั่น 3.2.25 แล้ว tr '[a-z]' [[A-Z]'วิธีการแก้ปัญหาของคุณทำงานและฉันพยายาม
mtk

20
@mtk tr '[a-z]' '[A-Z]'ที่ควรจะเป็น
l0b0

2
ฉันทำงานอยู่GNU bash, version 4.3.42(1)-release (x86_64-apple-darwin14.5.0)และฉันได้รับข้อผิดพลาดเดียวกับ OP ดังนั้นฉันจึงไม่คิดว่าจะมีให้ใช้งานในรุ่นbash4.0 ขึ้นไปตามที่คุณพูด
Heath Borders

79
echo "lowercase" | tr a-z A-Z

เอาท์พุท:

LOWERCASE

1
ผมคิดว่า POSIX ไม่จำเป็นต้องใช้/ในขณะที่tr /a-z/ /A-Z/ก่อนที่จะแก้ไขของฉัน: เพียงแค่นี้ทำงานเพราะจะแทนที่/โดย/แต่ไม่มีประโยชน์: pubs.opengroup.org/onlinepubs/9699919799/utilities/tr.htmltr '[:lower:]' '[:upper:]'นอกจากนี้ยังมีอยู่ที่คลุมเครือมากขึ้นและมีประโยชน์น้อย
Ciro Santilli 新疆改造中心法轮功六四事件

แก้ไข. TR แตกต่างกันมาก แต่ใช้งานได้
Doug

umlauts ไม่ทำงานกับสิ่งนี้
Evgeny

22

ระวังด้วย tr เว้นแต่ AZ ใช้ทั้งหมด สำหรับตำแหน่งที่ตั้งอื่นแม้ '[: ลดลง:]' '[: บน:]' ล้มเหลวเฉพาะ toupper และ bash ของ awk (v4 +) เท่านั้น

$ str="abcåäö"
$ echo "$str"|tr '/a-z/' '/A-Z/'
ABCåäö
$ echo "$str"|LC_ALL=sv_SE tr '[:lower:]' '[:upper:]'
ABCåäö
$ echo "$str"|awk '{print toupper($0)}'
ABCÅÄÖ
$ echo ${str^^} # Bash 4.0 and later
ABCÅÄÖ
$ STR="ABCÅÄÖ"
$ echo ${STR,,}
abcåäö

1
FWIW tr '[:lower:]' '[:upper:]'กำลังทำงานกับตัวอย่างของคุณบน OS X เป็นอย่างน้อย (กับLC_ALL=sv_SE)
Ethan

1

หรือคุณสามารถสลับไป ksh หรือ zsh ซึ่งได้รับการสนับสนุนการแปลงกรณีสำหรับทศวรรษที่ผ่านมา (นานก่อนที่จะbash's ${var^^}เพิ่มเข้ามาใน 4.0) แม้ว่าจะมีไวยากรณ์ที่แตกต่างกัน:

#! /bin/ksh -
typeset -u upper="$1"
printf '%s\n' "$upper"

(ใช้ได้กับzsh; โปรดทราบว่าใน pdksh / mksh นั้นใช้ได้กับตัวอักษร ASCII เท่านั้น)

ด้วยzsh, คุณยังสามารถใช้การตั้งUค่าสถานะการขยายพารามิเตอร์:

#! /bin/zsh -
printf '%s\n' "${(U)1}"

POSIXLY คุณสามารถใช้:

awk 'BEGIN{print toupper(ARGV[1])}' "$1"

นอกจากนี้ยังมี:

printf '%s\n' "$1" | tr '[:lower:]' '[:upper:]'

แต่ในการติดตั้งใช้งานไม่กี่ครั้งรวมถึง GNU trที่ใช้งานได้กับอักขระไบต์เดียว (ดังนั้นในโลแคล UTF-8 จะใช้ตัวอักษร ASCII เท่านั้น)


0

หากมีบางคนยังได้รับข้อผิดพลาดลอง${str^^}คุณสามารถลองpython -cหรือperlอาจเป็นเพราะรุ่นทุบตีต่ำกว่า 4

แต่จนถึงตอนนี้ทุบตี 4 หรือมากกว่านั้นทำงานได้อย่างรวดเร็วด้วยโซลูชั่นที่มีอยู่

L2U="I will be upper"

ใช้python -cในทุบตี

python -c "print('$L2U'.upper())"
I WILL BE UPPER

ในทำนองเดียวกันมันยังสามารถใช้เพื่อใช้ประโยชน์จาก:

service="bootup.sh on home"
python -c "print('$service'.capitalize())"
Bootup.sh on home

การใช้ perl

echo $L2U | perl -ne 'print "\U$_"'
I WILL BE UPPER
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.