2012-01-19 33 views
37

Tôi đang cố gắng để lấy 5 ký tự đầu tiên từ một chuỗi và nhưng vẫn nhận được lỗi Bad substitution cho dòng chuỗi thao tác, tôi đã những dòng sau trong teststring.sh kịch bản của tôi:Cố gắng truy xuất 5 ký tự đầu tiên từ chuỗi trong lỗi bash?

TESTSTRINGONE="MOTEST" 

NEWTESTSTRING=${TESTSTRINGONE:0:5} 
echo ${NEWTESTSTRING} 

tôi đã đi qua cú pháp nhiều lần và không thể nhìn thấy những gì im làm sai

Cảm ơn

+1

Quý vị có bất kỳ may mắn? Bạn đang sử dụng phiên bản bash nào? ('bash -version' hoặc' bash --version', thường) –

+2

@Mo.Tôi cũng muốn khuyến khích bạn chấp nhận câu trả lời dưới đây hoặc ít nhất là đưa ra một số phản hồi. Câu trả lời của Alex L là rất tốt, và nó chắc chắn xứng đáng với một số điểm internet giả! – Overbryd

Trả lời

30

trình ở đây:

$ TESTSTRINGONE="MOTEST" 
$ NEWTESTSTRING=${TESTSTRINGONE:0:5} 
$ echo ${NEWTESTSTRING} 
MOTES 

Bạn đang sử dụng vỏ nào?

+0

rất kỳ quặc! Tôi đang sử dụng bash –

+0

ok, nó hoạt động tốt trong thiết bị đầu cuối nhưng nó cung cấp cho các lỗi khi tôi chạy nó từ một kịch bản .sh –

+3

Có lẽ kịch bản của bạn không được thực hiện bởi bash nhưng bởi một số vỏ ít có khả năng. –

43

Tùy thuộc vào shell của bạn, bạn có thể sử dụng cú pháp sau:

expr substr $string $position $length 

Vì vậy, ví dụ bạn:

TESTSTRINGONE="MOTEST" 
echo `expr substr ${TESTSTRINGONE} 0 5` 

Ngoài ra,

echo 'MOTEST' | cut -c1-5 

hoặc

echo 'MOTEST' | awk '{print substr($0,0,5)}' 
2

Bạn có thể thử sed nếu bạn thích -

[jaypal:~/Temp] TESTSTRINGONE="MOTEST" 
[jaypal:~/Temp] sed 's/\(.\{5\}\).*/\1/' <<< "$TESTSTRINGONE" 
MOTES 
+0

Tôi nghĩ bạn có nghĩa là' sed 's/\ (. \ {5 \} \). */\ 1/'<<< $ TESTSTRINGONE' – potong

+0

Vâng, chuỗi của tôi đã bị cắt ngắn để bắt đầu. Hãy cập nhật nó ... Cảm ơn @potong –

+1

Bạn có thể muốn chỉnh sửa kết quả quá – potong

3

Điều này có thể làm việc cho bạn:

printf "%.5s" $TESTSTRINGONE 
1

Đó mở rộng tham số nên làm việc (? Những gì phiên bản của bash bạn có)

Đây là một cách tiếp cận khác:

read -n 5 NEWTESTSTRING <<< "$TESTSTRINGONE" 
4

Chất nền có ${variablename:0:5} là tính năng bash, không có sẵn trong vỏ cơ bản. Bạn có chắc chắn rằng bạn đang chạy điều này dưới bash? Kiểm tra dòng shebang (ở đầu tập lệnh) và đảm bảo rằng nó là #!/bin/bash, không phải #!/bin/sh.

+0

Đó là một trong những những điều đầu tiên tôi đã thử, nó vẫn cho cùng một lỗi. –

0
echo $TESTSTRINGONE|awk '{print substr($0,0,5)}' 
29

echo 'mystring' |cut -c1-5 là giải pháp thay thế cho vấn đề ur.

thêm về unix cut program

1

Cú pháp ban đầu sẽ làm việc với BASH nhưng không phải với DASH. Trên các hệ thống debian, có thể cho rằng bạn đang sử dụng bash, nhưng có thể là dấu gạch ngang thay vào đó. Nếu/bin/dash/tồn tại thì thử tạm thời đổi tên dấu gạch ngang thành một cái gì đó như no.dash và sau đó tạo liên kết mềm, còn gọi là ln -s/bin/bash/bin/dash và xem có khắc phục được sự cố hay không.

2

trình trong hầu hết các vỏ

TESTSTRINGONE="MOTEST" 
NEWTESTSTRING="${TESTSTRINGONE%"${TESTSTRINGONE#?????}"}" 
echo ${NEWTESTSTRING} 
# MOTES 
+1

Cho đến khi bashisms được chấp nhận bởi POSIX, +1 cho tính di động (mặc dù tiêu đề của chuỗi này được chỉ định bash). Tôi thích nhìn thấy những loại câu trả lời này để nâng cao nhận thức rằng tất cả thế giới không phải là bash. – Juan

Các vấn đề liên quan